Ubuntu 下 Galera cluster for MySQL 集群安装

时间:2022-09-19 19:46:13

mysql galera cluster官网:http://galeracluster.com/documentation-webpages/

相关安装教程:(不一定管用)

http://blog.csdn.net/zhiaini06/article/details/52317606

https://www.howtoing.com/how-to-configure-a-galera-cluster-with-mysql-5-6-on-ubuntu-16-04/

 

配置环境:

(1)3个Ubuntu服务器,版本ubuntu16.04

     服务器IP:

     192.168.93.133(主节点)

      192.168.93.132(从节点1)

      192.168.93.134(从节点2)

(2)三台服务器上均安装mysql5.7

(3)

1.首先安装必要依赖

apt-get install python-software-properties  
apt-get install software-properties-common  

2.添加GunPG key

 
apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA  

3.键入命令确认Ubuntu版本信息

lsb_release -a  

4.配置Ubuntu下galera源。

 
cd /etc/apt/sources.list.d
touch galera.list  

在galera.list文件中添加url,命令为:nano -w galera.list

# Codership Repository (Galera Cluster for MySQL) deb http://releases.galeracluster.com/mysql-wsrep-VERSION/DIST RELEASE main deb http://releases.galeracluster.com/galera-3/DIST RELEASE main

注意:<>内字段需要自行替换与系统相应的版本。详解如下:

VERSION:mysql-wsrep 版本号。如: 5.7

DIST:通常为ubuntu

RELEASE:Ubuntu 发行版本。如: Ubuntu12.04 选择 precise ;Ubuntu 14.04 选择 trusty ; Ubuntu16.04 选择:xenial

如果不清楚,可通过命令lsb_release -a来查看上述信息。

 

5.继续配置源

 cd /etc/apt/preferences.d
touch  galera.pref  

在galera.pref 文件中添加如下配置:打开命令:nano -w galera.pref

 Package: *  
Pin: origin releases.galeracluster.com  
Pin-Priority: 1001  

更新源:

 apt-get update  

至此配置全部完成。

7.一旦在所有三个服务器上更新了存储库,我们就可以在三台服务器上运行以下命令安装MySQL5.7的修补程序与Galera

 apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7
 
8 开始在三个Ubuntu服务器上配置相应的节点
 
(1)在主节点133上设置如下:
编辑mysql配置文件/etc/my.cnf,没有的话就自己创建该文件。
cd /etc
nano  -w  my.cnf
在该文件中添加内容:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql binlog_format=ROW bind-address=0.0.0.0
#bind-address=127.0.0.1 default_storage_engine=innodb innodb_autoinc_lock_mode=2 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=122M wsrep_provider=/usr/lib/libgalera_smm.so wsrep_provider_options="gcache.size=300M; gcache.page_size=300M" wsrep_cluster_name="mycluster" wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134" wsrep_sst_method=rsync [mysql_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
[mysql]
wsrep_cluster_name="mycluster" wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"

wsrep_node_name="mynode133"#是否加引号?
wsrep_node_address="192.168.93.133"#主节点IP
 
特别注意:
(1)确保mysql配置文件包括 conf.d/.
!includedir /etc/mysql/conf.d/

(2)
确保二进制日志格式设置为使用行级复制,而不是语句级复制。
binlog_format=ROW
(3)确保默认InnoDB存储引擎
default_storage_engine=InnoDB

Galera集群不会使用MyISAM或类似nontransactional存储引擎。

 
 
 
(2)在从节点132上设置如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
binlog_format=ROW
bind-address=0.0.0.0
#bind-address=127.0.0.1
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=122M
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"
wsrep_sst_method=rsync

[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql]
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"

wsrep_node_name="mynode132"#是否加引号?
wsrep_node_address="192.168.93.132"#从节点1的IP

 
 
(3)在从节点134上设置如下:
 

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
binlog_format=ROW
bind-address=0.0.0.0
#bind-address=127.0.0.1
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=122M
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"
wsrep_sst_method=rsync

[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql]
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"

wsrep_node_name="mynode134"#是否加引号?
wsrep_node_address="192.168.93.134"#从节点2的IP

 
 
 
9 启动集群
当您完成安装和配置Galera集群时,您已经准备好要使用的数据库了,但是它们还没有连接到一起来形成集群。要做到这一点,您需要在一个节点上启动mysqld,使用--wsrep-new-cluster新建集群选项。这将初始化集群的新主组件。在此之后开始的每个节点将连接到组件并开始复制。
 
(1)启动第一个集群节点
         默认情况下,节点不会作为主组件的一部分开始。相反,他们假设主组件已经存在于集群中的某个地方。当节点开始时,它们尝试与集群中的其他节点建立网络连接。对于他们找到的每个节点,他们检查是否它是主组件的一部分。当他们找到主组件时,他们请求一个状态传输,以便将本地数据库与集群同步。如果他们找不到主要的组件,则仍然处于非操作状态。
         集群启动时没有主组件。为了初始化它,您需要显式地告诉一个节点使用--wsrep-new-cluster新建集群参数来执行此操作。按照约定,初始化主组件的节点称为第一个节点,因为它是第一个开始运行的节点。当您启动一个新的集群时,任何节点都可以作为第一个节点,因为所有的数据库都是空的。 
         记住,第一个节点只是“第一个”,它初始化主组件。这个节点可以落在后面,离开集群而不必影响主组件。要启动第一个节点,在第一个节点上启动数据库服务器。要使用的命令取决于您的操作系统和Galera集群版本。
                 

对所有系统使用SysV init脚本,运行以下命令:

 service mysql start --wsrep-new-cluster//常用该命令 

系统使用 systemd和Galera集群5.5或5.6,使用这个命令:

 systemctl start mysql --wsrep-new-cluster 

系统使用 systemd和Galera集群5.7,使用专用的 mysqld_bootstrap脚本:

/usr/bin/mysqld_bootstrap


一旦节点启动数据库服务器,通过检查wsrep_cluster_size来检查该启动是否成功。在数据库客户端,运行以下查询:
SHOW STATUS LIKE 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+


这个状态变量告诉您连接到集群的节点的数量。因为您刚刚启动了第一个节点,所以值是1。
此时,不要重新启动mysqld。



(2)在集群中添加额外的节点
当您启动第一个节点时,您将初始化一个新的集群。完成此操作后,添加所有其他节点的过程是相同的。
要向现有的集群添加一个节点,可以像往常一样启动mysqld。如果您的系统使用init,运行以下命令:
service mysql start
对于使用systemd的系统,可以运行以下命令:
systemctl start mysql
当数据库服务器初始化为一个新节点时,它连接到由wsrep_cluster_address参数定义的集群成员。使用该参数,它将自动检索集群映射并连接到所有可用的节点。
您可以使用wsrep_cluster_size状态变量来测试节点连接是否成功。在数据库客户端,运行以下查询

SHOW STATUS LIKE 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+


这表明第二个节点现在连接到集群。重复这个过程,将剩下的节点添加到集群中。
当集群中的所有节点都同意成员状态时,就会启动状态交换。在状态交换中,新节点检查集群状态。如果节点状态与集群状态不同,(通常情况下是这样),新节点将请求从集群中传输状态快照,并将其安装到本地数据库中。
完成此操作之后,新节点就可以使用了。




10 测试集群
当您的集群启动并运行时,您可能想要测试某些特性,以确保它们正常工作,或者为可能出现的实际问题做好准备。
(1)复制测试
要测试Galera集群是否按照预期工作,请完成以下步骤:
1 在数据库客户机上,验证所有节点之间是否相互连接
SHOW STATUS LIKE 'wsrep_%'; +---------------------------+------------+ | Variable_name | Value | +---------------------------+------------+ ... | wsrep_local_state_comment | Synced (6) | | wsrep_cluster_size | 3 | | wsrep_ready | ON | +---------------------------+------------+
wsrep_local_state_comment:值同步表明该节点连接到集群和操作。
wsrep_cluster_size:该值表示集群中的节点。
wsrep_ready:该值表明该节点连接到集群并能够处理事务。
2 在node1的数据库客户机上,创建一个表和插入数据:
CREATE DATABASE galeratest; USE galeratest; CREATE TABLE test_table ( id INT PRIMARY KEY AUTO_INCREMENT, msg TEXT ) ENGINE=InnoDB; INSERT INTO test_table (msg) VALUES ("Hello my dear cluster."); INSERT INTO test_table (msg) VALUES ("Hello, again, cluster dear.");
3 在node2的数据库客户机上,检查数据是否被正确复制:
USE galeratest; SELECT * FROM test_table; +----+-----------------------------+ | id | msg | +----+-----------------------------+ | 1 | Hello my dear cluster. | | 2 | Hello, again, cluster dear. | +----+-----------------------------+
SELECT查询中给出的结果表明,您在node1中输入的数据已经复制到node2中。
(2) split - brain测试
为了在两个节点集群上测试Galera集群,请完成以下步骤:
(1)断开两个集群节点之间的网络连接。quorum丢失,节点不服务请求。
   (2)重新连接网络连接。quorum仍然丢失,节点不提供请求
    (3)在一个数据库客户机上,重新设置quorum:
                          SET GLOBAL wsrep_provider_options='pc.bootstrap=1';
        quorum被重置,集群恢复
 
 
 
(3)故障仿真
您还可以通过模拟三个节点上的各种故障情况来测试Galera集群:
要模拟单个mysqld进程的崩溃,可以在下面的一个节点上运行以下命令:
killall -9 mysqld
为了模拟网络断开,使用iptables或netem来阻止所有的ip流量到一个节点
要模拟整个服务器崩溃,在虚拟的来宾中运行每个mysqld,并彻底终止整个虚拟实例

(4)重启集群
 偶尔,您可能不得不重新启动整个Galera集群。例如,在停电的情况下,每个节点都被关闭,并且根本没有mysqld进程,这可能会发生。
 
要重新启动整个Galera集群,请完成以下步骤:
 
使用数据状态最新的节点状态ID标识节点。
 
启动该节点作为集群的第一个节点。
 
像往常一样启动节点的其余部分。
 
如何识别数据最新的节点:通过比较集群中不同节点上的全局事务ID值来确定数据最新的节点的状态ID。你可以在grastate.dat文件中找到它。该文件位于数据库的datadir中,如果grastate.dat文件如下所见,您已经找到了数据最新的节点的状态ID:
# GALERA saved state version: 2.1 uuid: 5ee99582-bb8d-11e2-b8e3-23de375c1d30 seqno: 8204503945773 cert_index:

要找到最后一个提交事务的序列号,使用--wsrep-recover选项运行mysqld。这将把InnoDB表空间恢复到一致状态,将对应的全局事务ID值打印到错误日志中,然后退出。例如:
130514 18:39:13 [Note] WSREP: Recovered position: 5ee99582-bb8d-11e2-b8e3- 23de375c1d30:8204503945771
这个值是节点状态ID,您可以使用它来手动更新grastate.dat文件。通过为seqno字段输入该文件,或者让 mysqld_safe 自动恢复,并在下一次启动时将值传递给数据库服务器。
 
 
(5)引导的安全保护
从提供者版本3.19开始,Galera还提供了额外的保护,以防止在集群关闭之前的集群中最后一个节点上使用一个节点来引导集群.
如果Galera能够决定性地确定最后一个节点是哪个节点,那么它将被标记为“安全引导”,就像这个例子中的grastate.dat:
# GALERA saved state version: 2.1 uuid: 5981f182-a4cc-11e6-98cc-77fabedd360d seqno: 1234 safe_to_bootstrap: 1
这样的节点可以用来引导集群。尝试使用任何其他节点的引导将导致以下错误消息:
2016-11-07 01:49:19 5572 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .


(6)GCACHE复苏
从提供者版本3.19开始,Galera提供了gcache。恢复参数。如果设置为yes,Galera将尝试在节点启动时恢复gcache。
如果gcache恢复成功,则该节点将处于向其他连接节点提供支持的位置,这将加快整个集群的总体重启时间。
Gcache恢复要求整个Gcache文件被读取两次。对于位于慢磁盘上的大型gcache文件,此操作可能需要一些时间。
Gcache恢复是“最好的努力”操作。如果恢复不成功,则节点将继续正常运行,但是其他节点在尝试连接时将返回到SST。