如何在Ubuntu 16.04上配置具有多个主机的MySQL群集
MySQL是目前流行的关系数据库管理系统之一。
安装和配置MySQL非常简单明了。
对于较小的和教程 ,单个MySQL服务器的标准设置可以很好地工作。
但是创建具有多个主服务器的高可用性设置非常棘手。
人们通常在MySQL中用于多节点设置的流行模型是主/从设置(其中,从设备通常用于只读操作,以减少主服务器上的请求数量)。
在本文中,我们将讨论一种创建多主MySQL集群的方法(该集群中的任何节点都可以处理读/写请求)。
为此,我们将使用MySQL Galera集群。
与标准的MySQL复制不同,Galera群集将同时启用对多个MySQL节点的读取和写入。
我们将使用标准的haproxy设置来平衡这些MySQL节点之间的流量。
准备工作
为了完成本教程,我们将需要在环境中创建4个ubuntu 16.04服务器。
请注意,所有这些服务器都应位于同一局域网中,以实现更好的访问。
- 3个用于MySQL Galera Cluster(Ubuntu 16.04)的服务器
- 1个Haproxy(Ubuntu 16.04)
首先,为MySQL设置3台服务器。
第1步-确保在所有三台服务器上均启用Galera/MySQL存储库
要使用apt-get安装galera集群,我们需要执行的第一步是添加galeracluster.com提供的apt存储库。
ubuntu apt仓库中的标准MySQL软件包不适用于Galera群集(因为它需要修补程序)。
因此,建议如下所示启用galeracluster.com存储库。
sudo apt-get update && apt-get install software-properties-common
上面的命令将安装所需的工具,以添加/修改外部软件存储库。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
现在,我们需要将galera存储库详细信息添加到apt配置中,如下所示。
sudo echo "deb http://releases.galeracluster.com/mysql-wsrep-5.6/ubuntu xenial main" >> /etc/apt/sources.list.d/galera.list sudo echo "deb http://releases.galeracluster.com/galera-3/ubuntu xenial main" >> /etc/apt/sources.list.d/galera.list
为了确保在其他存储库中首选galera存储库,我们需要为apt创建一个首选项文件。
echo -e "Package: *\nPin: origin releases.galeracluster.com\nPin-Priority: 1001" > /etc/apt/preferences.d/galera.pref
最终的apt-get更新将确保apt缓存在列表中具有新添加的存储库软件包。
sudo apt-get update
第2步-在所有三台服务器上安装Galera/MySQL
现在,我们需要在所有三个节点上安装galera及其依赖项。
这是一个简单的apt-get命令。
请注意,以下命令将要求我们设置一个MySQL根密码(我们可以在这三个节点上保留相同或者什至不同的根密码,因为稍后在形成集群时会更改此密码)。
sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6 rsync
步骤3-在所有三台服务器上配置Galera/MySQL群集
MySQL带有/etc/mysql/conf.d/的包含目录设置。
这意味着在启动过程中,MySQL将读取/etc/mysql/conf.d/中任何扩展名为.cnf的文件。
对于galera cluster,我们将在此目录中创建一个文件。
sudo vim /etc/mysql/conf.d/galera.cnf
内容应在第一台服务器上如下。
[mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Specific Config wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="testing_db" wsrep_cluster_address="gcomm://10.132.18.15,10.132.65.15,10.132.12.213" wsrep_sst_method=rsync wsrep_node_address="10.132.18.15" wsrep_node_name="db1"
请注意,我们需要用小滴的正确专用IP地址替换10.132.18.15,10.132.65.15,10.132.12.213.
我们将集群命名为“ testing_db”,并且第一个节点将命名为db1.
在这三台服务器上,最后两行将有所不同。
休息将保持不变。
在第二台服务器上,最后两行如下。
wsrep_node_address="10.132.65.15" wsrep_node_name="db2"
在第三台服务器上,这两行将如下所示。
wsrep_node_address="10.132.12.213" wsrep_node_name="db3"
步骤4-在节点之间形成集群
在所有三个节点上停止MySQL。
sudo systemctl stop mysql
现在,我们需要使用“ wsrep-new-cluster”命令启动第一个节点来初始化集群,如下所示。
在第一个节点(db1)上,运行以下命令。
/etc/init.d/mysql start --wsrep-new-cluster
在其余两个节点上,只需执行systemctl mysql start命令,如下所示。
systemctl start mysql
完成此操作后,所有节点的群集大小值应为3.
可以通过执行以下所示的SQL查询(在任何节点上)来找到群集大小。
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
第5步-创建一个HAProxy节点以负载均衡MySQL服务器之间的流量。
我们在上面创建的三个MySQL galera节点将充当数据库节点。
MySQL读写请求可以发送到任何节点,并且复制将自动在这些节点之间进行。
与标准的MySQL主从服务器设置不同,这三个节点均可用于读取和写入。
为了使我们的数据库设置高度可用,我们需要在这些节点之前安装一个负载平衡器,该负载平衡器可以根据其可用性将流量路由到任何节点。
对于负载均衡器,我们将使用Haproxy。
注意:我们现在将设置第四个Ubuntu 16.04 Droplet,它将成为我们的haproxy负载平衡器。
请注意,这个小滴必须与我们的galera节点位于同一数据中心,并且还需要启用专用网络。
apt-get update && apt-get install haproxy
需要在MySQL galera节点上创建一个用户,haproxy将使用该用户执行运行状况检查。
它是普通的MySQL用户。
在任何一个MySQL节点上执行以下操作(它会自动同步到其他节点,因为我们已经形成了集群)。
mysql -u root -p Enter password: mysql> CREATE USER 'haproxy'@'10.131.63.83'; Query OK, 0 rows affected (0.01 sec)
10.131.63.83是我们的haproxy私有IP地址。
我们还需要创建一个admin mysql用户来测试haproxy节点的连接性。
这可以通过在任何galera节点上执行以下操作来完成。
mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_admin'@'10.131.63.83' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES"
如前所述,10.131.63.83是我们的haproxy私有IP地址。
上面的查询将允许以haproxy_admin用户从IP地址10.131.63.83(这是我们的haproxy)登录到MySQL服务器。
现在可以将Haproxy节点配置为指向我们的三个数据库节点。
将以下内容追加到文件/etc/haproxy/haproxy.conf中。
listen testgalera bind 10.131.63.83:3306 balance source mode tcp option tcpka option mysql-check user haproxy server db1 10.131.60.8:3306 check weight 1 server db2 10.131.60.35:3306 check weight 1 server db3 10.131.61.117:3306 check weight 1
在上述配置中,我们明确要求haproxy使端口3306仅在专用ip地址上可用(从线路绑定10.131.63.83:3306可以看出)。
最后三行是我们的后端galera MySQL节点。
我们还使用用户haproxy指定了mysql-check。
重新启动Haproxy
service haproxy restart
通过使用haproxy IP地址执行以下查询,我们可以确认请求是否已由多个节点服务。
mysql --host=10.131.63.83 -u haproxy_admin -ppassword -e 'SELECT VARIABLE_VALUE as "backend ID" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_gcomm_uuid"'
上面的命令应针对多个请求返回不同的ID。
这表明请求正在由不同的后端节点处理。
从现在开始,要访问MySQL,我们将使用我们的HaProxy IP地址。