学习预览:
(一)mysql 运维基础篇(Linux云计算从入门到精通)
(三)mysql 触发器、存储过程和函数(数据库运维基础补充)
(五)mysql数据备份—物理备份(完备+lvm快照+xtrabackup)+逻辑备份(mysqldump+导入导出)
(六)mysql复制技术—M-S主从配置(传统+GTID)+M-M-S-S主从配置(GTID)
(七)mysql中间件mycat配置和部署(基于M-M-S-S)
(八) 数据库集群技术—Galera Cluster安装与配置
(九)数据库集群技术Galera+mycat(数据库运维学习终章)
CONTENT
8.3 配置Galera replication
8.1 Galera Cluster概述
Galera Cluster就是集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,都是基于Galera的。
为什么使用Galera集群呢?因为MySQL的主从模式,天生的不能完全保证数据一致,这就需要一个新型的架构来解决这个问题。所以Galera集群就产生了。
相比传统的主从复制架构,Galera Cluster解决的最核心问题是,在三个实例(节点)之间,它们的关系是对等的,multi-master架构的,在多节点同时写入的时候,能够保证整个集群数据的一致性,完整性与正确性。
上图中有三个实例,组成了一个集群,而这三个节点与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,这种一般称为multi-master架构,当有客户端要写入或者读取数据时,随便连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构。
这个架构支持多点写入,完全避免了主从复制经常出现的数据不一致的问题,从而可以做到主从读写切换的高度优雅,在不影响用户的情况下,离线维护等工作,保持MySQL的高可用性。
8.2 安装Galera Cluster
8.2.1 前期准备
在安装Galera Cluster之前介绍一下mysql的结构,总共四台数据库服务器,实际生产过程中会不一样,根据需要进行改动。
三台主机添加各自的主机解释,关掉防火墙,卸载掉之前安装的mysql,因为要重新下载带有补丁的mysql包。
8.2.2 下载并安装Galera
(1)官网下载链接:https://galeracluster.com/downloads/
我选择的是稳定版本5.7,这个安装包很全面:
(2)打开7版本,发现这就是yum仓库,下面配置yum仓库来安装它。(复制好网页链接)
(3)配置yum仓库,并开始安装;并配置本地yum仓库,方便其他三台主机下载。
#1、配置yum仓库
vim /etc/yum.repos.d/galera.repo
[galera]
name=galera
baseurl=http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/
gpgcheck=0
#2、打开缓存,只需要修改keepcache=1。
#这样可以缓存下载的Galera软件包,这样我们就可以自建一个yum本地仓库让其他三台主机下载
vim /etc/yum.conf
keepcache=1
#3、开始安装
yum repolist
yum install mysql-wsrep-5.7.x86_64 galera.x86_64 -y
#4、查看是否安装好
[Root@galera1 ~]# rpm -qa | grep mysql
mysql-wsrep-libs-compat-5.7-5.7.29-25.21.el7.x86_64
mysql-wsrep-common-5.7-5.7.29-25.21.el7.x86_64
mysql-wsrep-client-5.7-5.7.29-25.21.el7.x86_64
mysql-wsrep-server-5.7-5.7.29-25.21.el7.x86_64
mysql-wsrep-5.7-5.7.29-25.21.el7.x86_64
mysql-wsrep-libs-5.7-5.7.29-25.21.el7.x86_64
#5、自建yum本地仓库
mkdir galera
find /var/cache/yum/x86_64/7/ -iname '*.rpm' -exec cp -a {} galera \;
ll galera/
yum install vsftpd createrepo -y
cp -r galera /var/ftp/
ls /var/ftp/galera/
createrepo /var/ftp/galera/
systemctl start vsftpd;systemctl enable vsftpd
#6、其它三台主机开始配置yum本地源,指向Galera1的ftp
#Galera2配置
vim /etc/yum.repos.d/galera.repo
[garela]
name=galera
baseurl=ftp://galera1/galera
gpgcheck=0
#copy到其他两台机器上
scp -r /etc/yum.repos.d/galera.repo galera3:/etc/yum.repos.d/
scp -r /etc/yum.repos.d/galera.repo galera4:/etc/yum.repos.d/
#下面在这三台机器上安装,是不是很快呢
yum install mysql-wsrep-5.7.x86_64 galera.x86_64 -y
8.3 配置Galera Replication
8.3.1 创建数据同步的用户
#启动数据库
systemctl start mysqld;systemctl enable mysqld
#修改密码
newpass=`grep 'temporary passsword' /var/log/mysqld.log | awk '{print $NF}'`
mysqladmin -p'$newpass' password Root@123
#创建用于同步数据的账号,每个主机都要设置
mysql> grant all on *.* to 'sst'@'192.168.119.%' identified by 'Galera@123';
mysql> flush privileges;
8.3.2 文件my.cnf配置
#Galera1配置,其他三台主机也是一样,my.cnf里面的文件稍作修改就好了
vim /etc/my.cnf
---------------------------------------------------------------
server-id=1
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://' #Galera1是主的,所以这边不用配置
wsrep_node_name='galera1'
wsrep_node_address='192.168.119.163'
wsrep_sst_auth=sst:Galera@123
wsrep_sst_method=rsync
---------------------------------------------------------------
systemctl restart mysqld
ss -tnlp | egrep '3306|4567' #检测端口是否打开
LISTEN 0 128 *:4567 *:* users:(("mysqld",pid=38838,fd=12))
LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=38838,fd=38))
mysql> show status like 'wsrep%'; #这时候只开启了Galera1,所以只有1个集群
-----------------------------------------------------------------------
| wsrep_incoming_addresses | 192.168.119.163:3306 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | dc83dbfb-83b7-11ea-9c4c-37b1d187d984 |
| wsrep_cluster_conf_id | 1 |
| wsrep_cluster_size | 1 |
-----------------------------------------------------------------------
#把Galera1的my.cnf文件拷给其他三台文件,改一下server-id,主机名和IP以及集群
for i in {2..4}; do scp -r /etc/my.cnf galera$i:/etc; done
#在举出一个Galera2的配置情况,其他模仿就好了,配置重启mysqld
vim /etc/my.cnf
----------------------------------------------------------------------------------------
server-id=2
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://galera1,galera3,galera4' #这边需要假如其他三位主机,防止有机器down掉
wsrep_node_name='galera2'
wsrep_node_address='192.168.119.160'
wsrep_sst_auth=sst:Galera@123
wsrep_sst_method=rsync
----------------------------------------------------------------------------------------
#等所有的Mysqld服务器配置好之后,再看一下集群状态,成功的状态应该是四个哦
mysql> show status like 'wsrep%';
--------------------------------------------------------------------------------------
| wsrep_incoming_addresses | 192.168.119.161:3306,192.168.119.162:3306,192.168.119.160:3306,192.168.119.163:3306 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0.000933283/0.16847/1.00222/0.372863/6 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | 73a7b43d-83ba-11ea-bcdd-1ed6d698c92d |
| wsrep_cluster_conf_id | 4 |
| wsrep_cluster_size | 4
--------------------------------------------------------------------------------------
8.4 验证Galera
8.4.1 各台插入数据并查看
#Galera1创建数据库、表并插入数据
mysql> create database testdb;
mysql> create table testdb.t1(id int,name varchar(50));
mysql> insert into testdb.t1 values (1,'galera1');
#Galera2插入数据
insert into testdb.t1 values (2,'galera2');
#Galera3插入数据
mysql> insert into testdb.t1 values (3,'galera3');
#Galera4插入数据并查看表t1
mysql> insert into testdb.t1 values (4,'galera4');
mysql> select * from testdb.t1;
+------+---------+
| id | name |
+------+---------+
| 1 | galera1 |
| 2 | galera2 |
| 3 | galera3 |
| 4 | galera4 |
+------+---------+
8.4.2 重启服务器
这个就要注意了,重启Galera2、Galera3和Galera4没有问题,但是重启Galera1就有问题咯,因为在Galera1的my.cnf文件中,它并没有加入其它任意一个集群,所以就出现问题了。
所以只要在my.cnf中加入其它任意一台mysql服务器就可以了。这个我就不演示啦。