搭建3节点的基于galera cluster for mysql的mysql分布式数据库集群,测试有效

搭建3节点的基于galera cluster for mysql的mysql分布式数据库集群

 运行环境:

1虚拟机系统版本 

Ubuntu16.04版本(系统登录:root(ubuntu1))

数据库版本 

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上登录218220

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;

 

然后到节点218220上使用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)检查集群状态,参考上面的步骤五验证重启是否成功。

原文地址:https://www.cnblogs.com/dengyungao/p/12492940.html