MySQL Galera 集群安装与配置

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/weixin_42867972/article/details/84198696

galera 集群概述与搭建

alt

Galera replication原理

从客户端看整体的流程

其中对应的角色分为2个:协调者和参与者

alt

协调者:

1、 接收客户端请求 
2、 广播请求到其他参与者(包括自己) 
3、 作为参与者进行数据更新 
4、 更新失败或者成功返回给客户端

参与者

1、接收协调者的广播请求,然后进行数据库的更新

时序图

alt

关键技术

1、全局唯一ID生成,保证ID的唯一和递增 
2、协调者自己也是通过广播接收后进行的数据库业务操作,各个节点平等,保证了并发 
3、事务传输要么成功传给了所有节点,要么都失败 
4、事务在所有节点中的顺序一致 
5、每个节点知道所有节点的状态(通过广播实现)

优势

  • 与异步复制相比:
    数据一致性强,传统异步复制并不能保证主从数据一致性,这是由于一般情况下,主库多线程并发执行
    事务,但从库却只有一个线程重做事务,在高压力情况下必然会导致主从延迟。

  • 与使用半同步复制或分布式锁实现的同步复制相比:
    性能高,扩展性好,半同步复制在高负载甚至从库性能较差的情况下,难以保证其性能。即使自动的
    从半同步复制切换到异步复制,也会牺牲其最大的优点:一致性。其扩展友好度也较差

  • galera集群的独特优势:

1. 同步复制,主备无延迟
2. 支持多主同时读写,保证数据一致性
3. 集群中各节点保存全量数据
4. 节点添加/删除,自动检测和配置
5. 行级别并行复制
6. 不需要写binlog

缺点:

DDL操作会严重阻塞同步线程,线上大动作DDL会导致有可能导致节点堵塞无响应,更进一步会导致
部分节点下线。实际使用中需要搭配pt-osc或者gh-osc等在线DDL工具来进行操作DDL。

galera 集群架构搭建

alt

步骤:

一、集群节点中的主机名能互相解析(/etc/hosts 文件一致)

[root@rehl-14 ~]# vim /etc/hosts
192.168.10.10 rehl-10
192.168.10.14 rehl-14
192.168.10.15 rehl-15

二、3台主机 分别安装 galera集群对应的 rpm 包

galera集群对应的 rpm 包连接下载
链接:https://pan.baidu.com/s/1Z4cV__uhw79IMJpJ_r9CMg 密码:4k5u

yum install rsync 

 yum remove   mariadb-libs  ##卸载mariadb 冲突的软件包
 
 rpm -ivh mysql-wsrep-common-5.7-5.7.21-25.14.el7.x86_64.rpm
 rpm -ivh mysql-wsrep-libs-5.7-5.7.21-25.14.el7.x86_64.rpm
 rpm -ivh mysql-wsrep-client-5.7-5.7.21-25.14.el7.x86_64.rpm 

yum install  mysql-wsrep-server-5.7-5.7.21-25.14.el7.x86_64.rpm
yum install galera-3-25.3.23-2.el7.x86_64.rpm

三、对一下配置进行关闭

如果下列配置有开启就必须要关闭,否则会影响到galera集群的启动!

[root@rehl-14 ~]# vim /etc/my.cnf
sync_binlog=0
# basedir=/usr/local/mysql57   ##注释掉
binlog_rows_query_log_events=OFF ##导致集群多写入时失败,一定要关闭!
   
#plugin-load=rpl_semi_sync_master=semisync_master.so  ##关闭半同步复制,提供了同步复制。
#rpl_semi_sync_master_enabled=1
    
gtid-mode=ON     ##启用GTID功能。
enforce-gtid-consistency=ON

再次附上 /etc/my.cnf 的配置文件;可参照以下配置,复制应用时,创建对应的文件目录即可
链接:https://pan.baidu.com/s/1ciNC-_pV4iAvzAOttWj6lQ 密码:f0ff

四、进行数据库的初始化,启动服务修改密码

[root@rehl-14 ~]# mysqld --initialize --user=mysql   ##此时会在/mysql 下,产生全新的数据库
[root@rehl-14 ~]# mysqld --daemonize --datadir=/mysql  ##启动数据库

五、创建表和用户进行授权

新建一个新数据库名 class,授权一个新用户 mary 在数据库 class 下允许所有权限,密码 123123 允许的网段为 192.168.10.%

[root@rehl-14 ~]# grant all on class.*  to 'mary'@'192.168.10.%' IDENTIFIED BY '123123';

六、停止数据库增加配置选项

[root@rehl-14 ~]# killall mysqld
[root@rehl-14 ~]# vim /etc/my.cnf
wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so  ##要确认插件是存在的
wsrep_cluster_name='cluster1'        ##集群名称
wsrep_cluster_address='gcomm://'     ##首次作为发起人,此处为空,不向任何人同步数据。
wsrep_node_name='rehl-14'            ##本机的主机名
wsrep_node_address='192.168.10.14'   ##本机的 IP 地址
wsrep_sst_auth=mary:123123           ##同步数据时,使用的账号密码,各个集群节点应该一致。
wsrep_sst_method=rsync               ##同步数据时使用的组件

七、从新登陆数据库察看集群信息

[root@rehl-14 ~]# mysqld --daemonize --datadir=/mysql
mysql>  show status like “%wsrep%”;

alt

八、在第一二加入的服务器上对配置的增加修改

在第一加入(rehl-10 192.168.10.10)修改(/etc/my.cnf)

[root@rehl-10 ~]# vim /etc/my.cnf
server-id=2  #不能重复

wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so  ##要确认插件是存在的
wsrep_cluster_name='cluster1'        ##集群名称
wsrep_cluster_address='gcomm://192.168.10.14,192.168.10.15'  ##向其他人同步数据同步数据。
wsrep_node_name='rehl-10'            ##本机的主机名
wsrep_node_address='192.168.10.10'   ##本机的 IP 地址
wsrep_sst_auth=mary:123123           ##同步数据时,使用的账号密码,各个集群节点应该一致。
wsrep_sst_method=rsync               ##同步数据时使用的组件

在第二加入(rehl-10 192.168.10.15)修改(/etc/my.cnf)

[root@rehl-15 ~]# vim /etc/my.cnf
server-id=3  #不能重复

wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so  ##要确认插件是存在的
wsrep_cluster_name='cluster1'        ##集群名称
wsrep_cluster_address='gcomm://192.168.10.14,192.168.10.10'  ##向其他人同步数据同步数据。
wsrep_node_name='rehl-15'            ##本机的主机名
wsrep_node_address='192.168.10.15'   ##本机的 IP 地址
wsrep_sst_auth=mary:123123           ##同步数据时,使用的账号密码,各个集群节点应该一致。
wsrep_sst_method=rsync               ##同步数据时使用的组件

从服务器启动服务后,在主服务器察看集群信息

mysqld --daemonize --datadir=/mysql
mysql>  show status like “%wsrep%”;

alt

发现对多了两个ip地址,证明galera集群已实现

Galera 集群搭建完成,进行测试

测试一

分别向三个节点 建库,建表, 插入数据操作,验证多点写入,观察数据是否同步

alt

在所有其余两个数据库中都可以查询到插入数据的存在

测试二:

下线其中一个节点 killall mysqld (不要是发起人 192.168.10.14 ),剩余节点继续添加数据, 拉开距离。
此时离线数据库重新上线,启动服务即可,观察是否能追上其他人的数据

当断开后一段时间重新连接会发现数据一样能够自动同步回来

测试三:

让 发起人节点 离线。 剩余服务器继续插入数据,拉开距离
再让 发起人 重新上线

[root@rehl-14 ~]# vim /etc/my.cnf
wsrep_cluster_address='gcomm://192.168.10.15,192.168.10.10' 

此时 gcomm:// 不在为空,要向其他服务器同步数据

测试四:

停止集群所有数据库

最后离开集群/停止的数据库 主机, 要最先 启动。否则可能导致数据丢失
如果要一台不是最后离开的主机强制启动。 修改 /mysql/grastate.dat
修改 safe_to_bootstrap: 0 为1,修改最先启动的数据库/etc/my.cnf
修改 wsrep_cluster_address='gcomm://‘ 为空,不向任何主机进行同步
然后再启动数据库服务,接着启动其他数据库!

猜你喜欢

转载自blog.csdn.net/weixin_42867972/article/details/84198696