如何在Ubuntu 16.04 LTS上将MariaDB Galera安装和配置为主复制主机
如何安装和配置MariaDB Galera master到Ubuntu Linux 16.04 LTS服务器上的主集群,以实现读写可扩展性?
MariaDB Galera Cluster是用于MariaDB数据库的开源,免费的同步多主集群。
它仅在Linux上可用,并且仅支持XtraDB/InnoDB存储引擎。
有针对MyISAM的实验支持,但尚未经过良好测试。
从MariaDB 10.1开始,默认情况下包含Galera Cluster的wsrep API。
Galera Cluster for MariaDB是一个易于使用的高可用性解决方案,可提供高系统正常运行时间,无数据丢失和可扩展性,以适应未来的增长。
Galera集群的好处
- 真正的多主设备随时读取和写入任何节点。
- 同步复制没有从属滞后,在节点崩溃时不会丢失任何数据。
- 紧密耦合所有节点都保持相同状态。节点之间不允许有分散的数据。
- 多线程从站以获得更好的性能。对于任何工作量。
- 没有主从故障转移操作或VIP使用。
- 热备在故障转移期间没有停机时间(因为没有故障转移)。
- 自动节点置备无需手动备份数据库并将其复制到新节点。
- 支持InnoDB。
- 对应用程序透明对应用程序不需要(或最少)更改。
- 无需读写拆分。
- 结果是一个高可用性的解决方案,该解决方案在数据完整性和即时故障转移方面均表现出色。
设置MariaDB Galera高可用性集群需要什么?
- 最少两台服务器(可以是云服务器或裸机服务器)。对于生产,请使用四台服务器(建议至少使用三台服务器)。
- 服务器之间的专用网络(LAN/VLAN)
- 如果在两个IDC之间设置,则两个数据中心之间的VPN
- 两台服务器上的Ubuntu Linux 16.04 LTS
让我们开始在Ubuntu上安装和配置MariaDB Galera。
步骤1设置/etc/hosts
首先在两台服务器上设置/etc/hosts文件:
$ sudo vi /etc/hosts
设置正确的专用IP地址:
192.168.1.45 mdb01 192.168.1.46 mdb02
关闭并保存文件。
测试一下:
$ ping -c2 mdb01 $ ping -c2 mdb02
输出示例:
PING mdb02 (192.168.1.46) 56(84) bytes of data. 64 bytes from gfs02 (192.168.1.46): icmp_seq=1 ttl=64 time=0.487 ms 64 bytes from gfs02 (192.168.1.46): icmp_seq=2 ttl=64 time=0.497 ms --- mdb02 ping statistics -- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.487/0.492/0.497/0.005 ms
步骤2为版本10.1启用MariaDB存储库
执行以下命令以启用mariadb存储库在两台服务器上安装10.1版本:
$ sudo apt-get install software-properties-common $ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 $ sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirror.lstn.net/mariadb/repo/10.1/ubuntu xenial main' $ sudo apt-get update
步骤3在Ubuntu Linux上安装MariaDB服务器v10.1
在两个服务器上执行以下apt-get命令/apt命令:
$ sudo apt-get install mariadb-server rsync
确认MariaDB root用户密码
步骤4为MariaDB Galera集群创建SSL证书
执行以下命令来创建CA,服务器和客户端证书,以便我们可以使用SSL协议在节点之间建立安全的加密连接,包括通过MySQL中的标准SSL支持进行数据库客户端和服务器之间的连接以及对复制流量进行加密特别是Galera Cluster本身。
SSL实现在群集范围内,不支持对复制流量的身份验证。
您必须为群集中的所有节点启用SSL,或者都不启用它们:
$ sudo openssl genrsa 2048 > ca-key.pem $ sudo openssl req -new -x509 -nodes -days 730 -key ca-key.pem -out ca-cert.pem $ sudo openssl req -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem -out server-req.pem $ sudo openssl rsa -in server-key.pem -out server-key.pem $ sudo openssl x509 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem $ sudo openssl req -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem -out client-req.pem $ sudo openssl rsa -in client-key.pem -out client-key.pem $ sudo openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem $ sudo openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
为了避免出现任何问题,我将它们设置为通用名称,如下所示:
- CA通用名称:MariaDB管理员
- 服务器通用名称:MariaDB服务器
- 客户端通用名称:MariaDB客户端
为SSL配置mysql客户端和服务器
编辑/etc/mysql/my.cnf:
$ sudo vi /etc/mysql/my.cnf
搜索和更新[client]部分,如下所示:
[client] port = 3306 socket = /var/run/mysqld/mysqld.sock ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/client-cert.pem ssl-key=/etc/mysql/ssl/client-key.pem
搜索和更新[mysqld]部分,如下所示:
[mysqld] ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem
保存并关闭文件。
在其他节点上安装证书
将证书复制到所有其他节点:
{Hyman@mdb01:ssl }$ ssh [email protected] mkdir -p /etc/mysql/ssl/ {Hyman@mdb01:ssl }$ scp * [email protected]:/etc/mysql/ssl/ ## if you have 3rd node do above commands on 3rd node too and so on ## ##{Hyman@mdb01:ssl }$ ssh [email protected] mkdir -p /etc/mysql/ssl/ ##{Hyman@mdb01:ssl }$ scp * [email protected]:/etc/mysql/ssl/
步骤5配置MariaDB Galera集群服务器
在两个服务器上创建以下文件:
$ sudo vi /etc/mysql/conf.d/galera.cnf
在mdb01
服务器上追加以下文本:
[mysqld] #mysql settings binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 query_cache_size=0 query_cache_type=0 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M bind-address=192.168.1.45 #Galera settings wsrep_provider="/usr/lib/galera/libgalera_smm.so" #SSL for Galera wsrep_provider_options="socket.ssl_key=/etc/mysql/ssl/server-key.pem;socket.ssl_cert=/etc/mysql/ssl/server-cert.pem;socket.ssl_ca=/etc/mysql/ssl/ca-cert.pem" wsrep_cluster_name="cbz_cluster" wsrep_cluster_address="gcomm://192.168.1.45,192.168.1.46" wsrep_sst_method=rsync wsrep_on=ON wsrep_node_address="192.168.1.45" wsrep_node_name="mdb01"
在mdb02
服务器上追加以下文本:
[mysqld] #mysql settings binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 query_cache_size=0 query_cache_type=0 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M bind-address=192.168.1.46 #Galera settings wsrep_provider="/usr/lib/galera/libgalera_smm.so" #SSL for Galera wsrep_provider_options="socket.ssl_key=/etc/mysql/ssl/server-key.pem;socket.ssl_cert=/etc/mysql/ssl/server-cert.pem;socket.ssl_ca=/etc/mysql/ssl/ca-cert.pem" wsrep_cluster_name="cbz_cluster" wsrep_cluster_address="gcomm://192.168.1.45,192.168.1.46" wsrep_sst_method=rsync wsrep_on=ON wsrep_node_address="192.168.1.46" wsrep_node_name="mdb02"
保存并关闭文件。
步骤6在mdb01服务器上启动MariaDB集群
执行以下命令:
$ sudo systemctl stop mysql
引导集群
在mdb01
服务器上执行以下命令:
$ sudo /usr/bin/galera_new_cluster
确认MySQL已启动:
$ ps aux | grep mysql
验证SSL是否正常
输入以下命令
$ grep ssl /var/log/syslog
输出示例:
Mar 6 16:05:39 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:05:39 140246539356416 [Note] WSREP: initializing ssl context Mar 6 16:05:39 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:05:39 140246539356416 [Note] WSREP: (a421036d, 'ssl://0.0.0.0:4567') listening at ssl://0.0.0.0:4567 Mar 6 16:05:39 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:05:39 140246539356416 [Note] WSREP: (a421036d, 'ssl://0.0.0.0:4567') multicast: , ttl: 1 Mar 6 16:05:39 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:05:39 140246539356416 [Note] WSREP: discarding pending addr without UUID: ssl://192.168.1.45:4567 Mar 6 16:05:39 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:05:39 140246539356416 [Note] WSREP: discarding pending addr without UUID: ssl://192.168.1.46:4567 Mar 6 16:10:00 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:10:00 140246201136896 [Note] WSREP: SSL handshake successful, remote endpoint ssl://192.168.1.46:57352 local endpoint ssl://192.168.1.45:4567 cipher: AES128-SHA compression: Mar 6 16:10:00 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:10:00 140246201136896 [Note] WSREP: (a421036d, 'ssl://0.0.0.0:4567') connection established to 401afcfe ssl://192.168.1.46:4567 Mar 6 16:10:00 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:10:00 140246201136896 [Note] WSREP: (a421036d, 'ssl://0.0.0.0:4567') turning message relay requesting on, nonlive peers: Mar 6 16:10:01 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:10:01 140246201136896 [Note] WSREP: declaring 401afcfe at ssl://192.168.1.46:4567 stable Mar 6 16:10:04 ubuntu-box-1 mysqld[9509]: 2016-03-06 16:10:04 140246201136896 [Note] WSREP: (a421036d, 'ssl://0.0.0.0:4567') turning message relay requesting off
验证集群是否正常运行
执行以下命令以验证集群是否已启动并且第一个节点正在运行:
$ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
步骤7在mdb02服务器上加入MariaDB集群
在" mdb01"服务器上执行以下命令以联合到mdb01集群:
$ sudo systemctl mysql stop $ sudo systemctl mysql start
验证一下:
$ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
输出示例:
Enter password: +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
请注意,值2表示我们的集群有两个主节点到主节点。
如果加入第三个节点,则应如下所示:
Enter password: +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
下面命令显示有关群集的更多信息:
$ mysql -u root -p -e "show status like 'wsrep%';"
Enter password: +------------------------------+--------------------------------------+ | Variable_name | Value | +------------------------------+--------------------------------------+ | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 0.000000 | | wsrep_causal_reads | 0 | | wsrep_cert_deps_distance | 0.000000 | | wsrep_cert_index_size | 0 | | wsrep_cert_interval | 0.000000 | | wsrep_cluster_conf_id | 2 | | wsrep_cluster_size | 2 | | wsrep_cluster_state_uuid | 1ff614b2-01e1-11e7-8e6b-6613e80d4934 | | wsrep_cluster_status | Primary | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 0.000000 | | wsrep_connected | ON | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | OPERATIONAL | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_recv | 0 | | wsrep_flow_control_sent | 0 | | wsrep_gcomm_uuid | 1ff51705-01e1-11e7-96a2-ca7fb2d337c2 | | wsrep_incoming_addresses | 192.168.1.46:3306,192.168.1.45:3306 | | wsrep_last_committed | 0 | | wsrep_local_bf_aborts | 0 | | wsrep_local_cached_downto | 18446744073709551615 | | wsrep_local_cert_failures | 0 | | wsrep_local_commits | 0 | | wsrep_local_index | 1 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_avg | 0.000000 | | wsrep_local_recv_queue_max | 1 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_local_state_uuid | 1ff614b2-01e1-11e7-8e6b-6613e80d4934 | | wsrep_protocol_version | 7 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy | | wsrep_provider_version | 25.3.19(r3667) | | wsrep_ready | ON | | wsrep_received | 6 | | wsrep_received_bytes | 407 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_replicated | 0 | | wsrep_replicated_bytes | 0 | | wsrep_thread_count | 2 | +------------------------------+--------------------------------------+
现在,您可以在任何节点上创建数据库和表,并且将在两个节点上将其复制:
{Hyman@mdb01:~ }$ mysql -u root -p -e 'create database foobar;'
从第二个节点验证:
{Hyman@mdb02:~ }$ mysql -u root -p -e 'show databases;'
输出示例:
Enter password: +--------------------+ | Database | +--------------------+ | demo | | foobar | | information_schema | | mysql | | performance_schema | +--------------------+
您可以按照以下方式从独立的MariaDB迁移到集群设置:
## On old MariaDB server ## ## Dump database named foobar without engine ## $ mysqldump -u root -p --skip-create-options foobar > foobar.sql ## Copy foobar.sql to any one of the clustered node named mdb02 ## $ scp foobar.sql 192.168.1.46:/root/ ## Restore database, from mdb02 ## $ mysql -u root -p foobar < foobar.sql