介绍
当在生产环境中处理关系数据库系统时,通常最好有某种复制过程。复制允许您的数据自动传输到不同的节点。 简单的主从复制在SQL世界中最常见。这允许您使用一个“主”服务器来处理所有应用程序写入,而多个“从属”服务器可用于读取数据。可以配置故障转移和其他技术。 虽然主从复制是有用的,但它不像主 - 主复制那么灵活。在主 - 主配置中,每个节点都能够接受写入并在整个集群中分布。 MariaDB默认情况下没有这个版本的稳定版本,但一组称为“Galera”的补丁实现同步主 - 主复制。 在本指南中,我们将使用Ubuntu 12.04 VPS实例创建一个Galera集群。我们将使用三个服务器进行演示(最小的可配置集群),但是对于生产情况,建议使用五个节点。添加MariaDB存储库
MariaDB和Galera软件包在默认的Ubuntu软件库中不可用。但是,MariaDB项目维护自己的Ubuntu存储库,包含我们需要的所有软件包。 在每个我们将配置这个集群三台服务器,你需要先安装python-software-properties
包。这将给我们管理我们的存储库需要的命令:
sudo apt-get update
sudo apt-get install python-software-properties
现在,我们可以添加MariaDB存储库的密钥文件。这将告诉我们的服务器,我们相信存储库的维护者,并且我们可以在其中安装这些包没有问题。
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
这将接受密钥文件。现在我们在数据库中有了可信密钥,我们可以添加实际的存储库:
sudo add-apt-repository 'deb http://mirror.jmu.edu/pub/mariadb/repo/5.5/ubuntu precise main'
使用Galera补丁安装MariaDB
我们现在可以通过apt接口轻松地安装MariaDB和Galera补丁。请记住首先更新数据库:sudo apt-get update
sudo apt-get install mariadb-galera-server galera
在安装过程中,将要求您设置MariaDB管理用户的密码。您可以在所有服务器实例上设置相同的密码。 如果由于某些原因,您的计算机上尚未安装rsync,您现在应该通过键入以下命令安装:
sudo apt-get install rsync
我们现在拥有开始配置集群所需的所有功能。
配置MariaDB和Galera
现在我们已经在我们的三个服务器上安装了MariaDB和Galera,我们可以开始配置了。 集群实际上需要共享其配置。因此,我们将在我们的第一台机器上进行所有配置,然后将其复制到其他节点。 在第一个服务器上,我们将创建一个单独的文件,其中包含集群的设置。 默认情况下,MariaDB的配置检查/etc/mysql/conf.d
目录中其他文件,以加强它的行为。我们可以在此目录中创建一个具有所有特定于集群的指令的文件:
sudo nano /etc/mysql/conf.d/cluster.cnf
将以下配置复制并粘贴到文件中。我们将解释你需要改变什么和每件意味着什么:
[mysqld] query_cache_size=0 binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 query_cache_type=0 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_provider=/usr/lib/galera/libgalera_smm.so #wsrep_provider_options="gcache.size=32G" # Galera Cluster Configuration wsrep_cluster_name="test_cluster" wsrep_cluster_address="gcomm://first_ip,second_ip,third_ip" # Galera Synchronization Congifuration wsrep_sst_method=rsync #wsrep_sst_auth=user:pass # Galera Node Configuration wsrep_node_address="this_node_ip" wsrep_node_name="this_node_name"第一部分修改或重新设置一些MariaDB / MySQL设置,这将允许MySQL正常运行。 标记为“Galera Provider Configuration”的部分用于配置提供WriteSet复制API的MariaDB组件。这意味着Galera在我们的情况下,因为Galera是一个wsrep(WriteSet复制)提供程序。 我们可以指定一般参数来配置初始复制环境。你可以找到更多关于 加莱拉配置选项在这里。一般来说,你不需要做太多的工作,尽管。 “Galera集群配置”部分定义了我们将要创建的集群。它通过IP地址或可解析的域名来定义集群成员,并为集群创建一个名称,以确保成员加入正确的组。 “Galera同步配置”部分定义集群如何在成员之间通信和同步数据。这仅用于在节点联机时发生的状态传输。对于我们的初始设置,我们只是使用rsync,因为它几乎是我们想要的,而不必使用异乎寻常的组件。 “Galera节点配置”部分仅用于阐明当前服务器的IP地址和名称。这在尝试诊断日志中的问题以及能够以多种方式引用每个服务器时很有用。名称可以是任何你想要的。 当您对群集配置文件满意时,应将内容复制到每个单独的节点。 请记住更改每个服务器上的“Galera节点配置”部分。 当在每个服务器上具有此配置时,自定义“Galera节点配置”部分时,应保存并关闭文件。
正在复制Debian维护配置
目前,Ubuntu和Debian的MariaDB服务器使用特殊的维护用户进行日常维护。某些超出维护类别的任务也会作为此用户运行,包括停止MySQL的重要功能。 由于我们的集群环境在各个节点之间共享,维护用户(在每个节点上随机生成登录凭据)将无法正确执行命令。只有初始服务器具有正确的维护凭证,因为其他人将尝试使用其本地设置来访问共享集群环境。 我们可以通过简单地将维护文件的内容复制到每个节点来解决这个问题: 在其中一个服务器上,打开Debian维护配置文件:sudo nano /etc/mysql/debian.cnf
您将看到如下所示的文件:
[client]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
我们只需要复制此信息并将其粘贴到每个节点上的同一文件中。 在第二个和第三个节点上,打开同一个文件:
sudo nano /etc/mysql/debian.cnf
删除当前信息并将参数从第一个节点的配置文件粘贴到这些其他服务器的文件中:
[client]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
他们应该是完全一样的现在。保存并关闭文件。
启动集群
首先,我们需要停止运行的MariaDB服务,以便我们的集群可以联机。 这可以很容易地通过在每个节点上键入:sudo service mysql stop
当所有进程停止运行时,必须使用特殊参数再次启动第一个节点:
sudo service mysql start --wsrep-new-cluster
使用我们的群集配置,每个联机的节点尝试连接到其配置文件中指定的至少一个其他节点以获得其初始状态。未经
--wsrep-new-cluster
参数,因为第一个节点不能与任何其他节点连接该命令会失败。 在每个其他节点上,您现在可以像平常一样启动MariaDB。他们将搜索在线的集群列表的任何成员。当他们找到第一个节点时,他们将加入集群。
sudo service mysql start
您的群集现在应该在线并进行通信。
测试主 - 主复制
我们已经完成了这一步的步骤,以便我们的集群可以执行主 - 主复制。我们需要测试这个,看看复制是否按预期工作。 在我们的一个节点上,我们可以这样创建一个数据库和表:mysql -u root -pmariadb_admin_password -e 'CREATE DATABASE playground;' mysql -u root -pmariadb_admin_password -e 'CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));'这将创建一个数据库,称为
playground
,这所谓的一个表里面
equipment
。 然后,我们可以通过执行以下操作将我们的第一个项插入此表:
mysql -u root -pmariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue")'我们现在在表中有一个值。 从 另外一个节点上,我们可以看到通过键入以下数据:
mysql -u root -pmariadb_admin_password -e 'SELECT * FROM playground.equipment;'
+----+-------+-------+-------+
| id | type | quant | color |
+----+-------+-------+-------+
| 1 | slide | 2 | blue |
+----+-------+-------+-------+
从同一个节点,我们可以写入数据到集群:
mysql -u root -pmariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'从我们的第三个节点,我们可以通过查询再次读取所有这些数据:
mysql -u root -pmariadb_admin_password -e 'SELECT * FROM playground.equipment;'
+----+-------+-------+--------+
| id | type | quant | color |
+----+-------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
+----+-------+-------+--------+
再次,我们可以从此节点添加另一个值:
mysql -u root -pmariadb_admin_password -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'回到第一个节点,我们可以看到我们的数据在任何地方都可用:
mysql -u root -pmariadb_admin_password -e 'SELECT * FROM playground.equipment;'
+----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
| 3 | seesaw | 3 | green |
+----+--------+-------+--------+
如你所见,我们的所有服务器都可以写入。这意味着我们的主主复制功能正常。
结论
此时,您应该在服务器上配置Galera群集。这可以在写密集型应用程序环境中有助于平衡负载。 如果计划在生产环境中使用Galera集群,您可能需要查看一些其他状态快照传输(sst)代理,如“xtrabackup”。这将允许您快速设置新节点,并且不会对活动节点造成大的中断。这不会影响实际的复制,但是当节点被初始化时是一个问题。
作者:Justin Ellingwood