搭建3节点的基于galera cluster for mysql的mysql分布式数据库集群,测试有效
搭建3节点的基于galera cluster for mysql的mysql分布式数据库集群
一 运行环境:
1虚拟机系统版本
Ubuntu16.04版本(系统登录:root(ubuntu1))
2 数据库版本
mysql5.7(用户名root 密码root)
二 安装环境:
首先,不论是在云服务器、物理机还是虚拟机上,至少需要3台主机(我们将这三台主机称为“Nodes”),对于每一个”Node”,硬件最低配置要求为:
- 1GHz单核CPU
- 512M的内存
- 100Mbps的网络连接
- 三台主机IP为:
- Node1: 192.168.1.210(主节点)
- Node2: 192.168.1.218(从节点1)
- Node3: 192.168.1.220(从节点2)
(1)禁用SELinux的mysqld
所有节点执行
如果你启用了SELinux,它可能会阻止 mysqld从执行所需的操作。你必须禁用SELinux mysqld。禁用SELinux mysql运行以下命令
apt install policycoreutils -y && semanage permissive -a mysqld_t
(2)防火墙配置:
直接关闭所有节点的防火墙
(3)禁用Ubuntu的apparmor:
所有节点执行
apparmor主要是Ubuntu系统中对mysql访问权限的控制,我们必须禁用AppArmor,以便配置mysql的mysqld能够运行外部程序。禁用apparmor:
sudo ln -s /etc/apparmor.d/usr /etc/apparmor.d/disable/.sbin.mysqld
apt install apparmor-utils -y
sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld
service apparmor restart
注:如果不禁用,则在登录mysql时会出现如下错误:
apparmor="DENIED" operation="open" ........
对应解决方案:
直接修改apparmor配置文件
nano /etc/apparmor.d/usr.sbin.mysqld
在配置文件中的以下行增加”flags=(complain)”,如下:
/usr/sbin/mysqld flags=(complain) {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>
#include <abstractions/mysql>
........
........
}
三 开始安装
(0)安装mysql5.7
所有节点执行
安装mysql5.7的步骤如下:
顺序执行:
sudo apt update 首先更新一下软件列表
sudo apt install mysql-client-core-5.7 -y 物理端的核心
sudo apt install mysql-client-5.7 -y 客户端的组件
sudo apt install mysql-server-5.7 -y 服务端,安装的过程会提示输入root用户的数据库密码
sudo apt install mysql-workbench -y 这是MySQL自己的可视化工具,至此已安装完毕,打开工具可直接登录
安装完成后查看状态: service mysql status
登录:mysql -u root -h localhost -p #输入密码
查看版本:mysql> select version();
(1)安装对应依赖
所有节点执行
apt-get install python-software-properties -y && apt-get install software-properties-common -y
(2)添加GunPG key
所有节点执行
apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
(3)配置Ubuntu下galera源
所有节点执行
创建galera.list文件:
touch /etc/apt/sources.list.d/galera.list
nano /etc/apt/sources.list.d/galera.list
在galera.list中添加内容:
#Codership Repository (Galera Cluster for MySQL)
deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu xenial main
deb http://releases.galeracluster.com/galera-3/ubuntu xenial main
链接中的“xenial”为你所用的ubuntu系统的版本号,如果不清楚自己的Ubuntu版本号,可通过命令lsb_release -a来查看。
(4)继续配置源
所有节点执行
touch /etc/apt/preferences.d/galera.pref
nano /etc/apt/preferences.d/galera.pref
在galera.pref文件中添加内容:
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001
(5)更新源
所有节点执行
sudo apt-get update
(6)安装mysql和Galera
一旦在所有服务器上更新了存储库,就可以在三台服务器上运行以下命令安装MySQL5.7的修补程序与Galera:
sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7 -y
报错:
解决:这是Ubuntu自身apt安装软件时的软件依赖问题。
按照错误提示执行: sudo apt-get -f install -y
又报错:
接着执行:
sudo dpkg -i --force-overwrite /var/cache/apt/archives/mysql-wsrep-common-5.7_5.7.29-25.21-1ubuntu16.04_amd64.deb
sudo apt-get -f install -y
sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7 -y
sudo apt autoremove -y
此时再执行”sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7 -y”时就不会报错了。
(7)安装完成之后,在每一个节点上启动Mysql:
所有节点执行
service mysql start
报错:
解决:
原因可能是之前使用apt-get 安装过mysql,服务被标记过,解除后即可启动:
systemctl unmask mysql.service
(8)验证节点之间是否能互相ping通:
主节点135上:
Ping 192.168.93.132
Ping 192.168.93.134
从节点132上:
Ping 192.168.93.135
Ping 192.168.93.134
从节点134上:
Ping 192.168.93.135
Ping 192.168.93.132
能ping同则表示三节点之间能互相通信。
(9)分别在三个节点上修改mysql的配置文件/etc/mysql/my.cnf
主节点210上:
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=1G"
wsrep_cluster_name="galeracluster2"
wsrep_cluster_address="gcomm://"
wsrep_sst_method=rsync
wsrep_sst_auth=root:root
wsrep_node_address="192.168.1.210"
wsrep_node_name=node210
lower_case_table_names=1
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
其中:
wsrep_sst_auth 数据库的root用户的用户名密码
从节点218上:
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=1G"
wsrep_cluster_name="galeracluster2"
wsrep_cluster_address="gcomm://192.168.1.210"
wsrep_sst_method=rsync
wsrep_sst_auth=root:root
wsrep_node_address="192.168.1.218"
wsrep_node_name="node218"
lower_case_table_names=1
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
从节点220上:
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=1G"
wsrep_cluster_name="galeracluster2"
wsrep_cluster_address="gcomm://192.168.1.218"
wsrep_sst_method=rsync
wsrep_sst_auth=root:root
wsrep_node_address="192.168.1.220"
wsrep_node_name=node220
lower_case_table_names=1
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
(10)在每个节点上重启mysql:
先重启主节点210,再重启218和220
service mysql restart
(11)验证mysql彼此监听是否成功
先将每个节点上的数据库的root用户远程登录权限打开,此处就不展开了。然后在任意一个节点上登录其余两个节点的数据库,如果都能彼此登录,则表明三台服务器上的mysql彼此监听成功。
如在210上登录218,220
mysql -h 192.168.1.218 -u root -p
mysql -h 192.168.1.220 -u root -p
如果彼此登录不成功,则需要在每个节点上创建用户以实现mysql的远程登录。创建用户时,需要对应每个节点的mysql的配置文件/etc/mysql/my.cnf中设置的“wsrep_sst_auth=wsrep:199077”项,该项用来设置服务器之间mysql彼此访问的用户名和密码,其中wsrep为用户名,199077为密码。
具体创建命令如下:
在每个节点上执行:
mysql -u root -h localhost -p
mysql> create user 'wsrep'@'%' identified by '199077';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'wsrep'@'%' IDENTIFIED BY '199077' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
然后重启各个节点的mysql
先重启主节点210,再重启218和220
service mysql restart
四 启动集群
1)在主节点上将mysql服务先停掉然后重启,注意一定要在前面提到的wsrep_cluster_address="gcomm://"的节点上(即主节点)执行最开始的启动程序,我这里是节点210上执行:
service mysql stop
service mysql start --wsrep-new-cluster
此时可能报错,执行“ journalctl -xe”查看报错如下:
Mar 13 23:36:22 ubuntu210 kernel: [254092.727648] audit: type=1400 audit(1584167782.519:569): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/mysqld" pid=68122 comm="apparmor_parser"
解决:
在每个节点上执行:
第一步:sudo apt-get remove apparmor
第二步:打开文件/usr/share/mysql/mysql-systemd-start,将该文件的以下行注释掉。
第三步:重启虚拟机 sudo reboot
第四步:执行service mysql start
2)在其他从节点上执行:service mysql restart
五 验证是否成功
查看数据表
登录主节点210:
mysql -u root -h localhost -p
Enter password:
mysql> SHOW STATUS LIKE 'wsrep%';
重点关注的是下面这几行:
wsrep_ready | ON
如果状态是 ON,那么就要看:
wsrep_cluster_size | 3
如果是3,那么是成功的,否则是不成功的!
六 复制测试
在主节点210上创建一个数据库:
mysql> CREATE database test;
mysql> show databases;
然后到节点218和220上使用show databases; 查看是否也有test这个数据库,如果有则成功!
七 集群的状态监控相关参数
(1)wsrep_cluster_state_uuid显示了cluster的state UUID,由此可看出该节点是否还是集群的一员;
SHOW GLOBAL STATUS LIKE 'wsrep_cluster_state_uuid';
(2)wsrep_cluster_conf_id显示了整个集群的变化次数。所有节点都应相同,否则说明某个节点与集群断开了;
(3)wsrep_cluster_status显示集群里节点的主状态。标准返回primary。如返回non-Primary或其他值说明是多个节点改变导致的节点丢失或者脑裂。如果所有节点都返回不是Primary,则要重设quorum。具体参见http://galeracluster.com/documentation-webpages/quorumreset.html如果返回都正常,说明复制机制在每个节点都能正常工作;
show global status like 'wsrep_cluster_status';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+
八 重启集群
偶尔,您可能不得不重新启动整个Galera集群。例如,在停电的情况下,每个节点都被关闭,并且根本没有mysqld进程,这可能会发生。
要重新启动整个Galera集群,步骤:
(1)把所有节点数据库服务关闭,在所有节点上执行:service mysql stop
(2)选择主节点,执行:
sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/g' /var/lib/mysql/grastate.dat
service mysql start --wsrep-new-cluster
(3)把所有从节点数据库服务开启,在所有从节点上执行:service mysql start
(4)检查集群状态,参考上面的步骤五验证重启是否成功。