MariaDB galera群集是多主同步群集。它只能在Linux系统上使用,并且只支持XTradB/InnoDB存储引擎。
我们在本篇文章将配置一个HA(高可用性)多主数据库群集。

VMware® Workstation 12 Pro

CentOS 7最小化的系统镜像
CentOS-7-x86_64-Minimal-1503-01.iso


hostname ip address node name node address cluster name
contoso21.com 192.168.10.21 db1 192.168.10.21 galera1_cluster
contoso22.com 192.168.10.22 db2 192.168.10.22 galera1_cluster

contoso23.com 192.168.10.23 db3 192.168.10.23 galera1_cluster

第1步: 建立主机IP地址与主机名称的映射关系[root@contoso21 ~]# cat > /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 contoso21.com::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.10.21 contoso21.com[root@contoso22 ~]# cat > /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 contoso22.com::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.10.22 contoso22.com[root@contoso23 ~]# cat > /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 contoso23.com::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.10.23 contoso23.com第2步: 添加MariaDB 软件包仓库在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:tee /etc/yum.repos.d/MariaDB.repo <<-'EOF'[mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/10.1/centos7-amd64gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=1EOF第3步: – 设置selinux的disabled模式 setenforce 0,并且关闭防火墙服务在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:cat > /etc/selinux/config# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:# enforcing - SELinux security policy is enforced.# permissive - SELinux prints warnings instead of enforcing.# disabled - No SELinux policy is loaded.SELINUX=disabled# SELINUXTYPE= can take one of three two values:# targeted - Targeted processes are protected,# minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection.SELINUXTYPE=targeted在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:systemctl stop firewalld && systemctl disable firewalldinit 6 ## reboot第4步: – 安装MariaDB galera群集10.1版软件包在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:yum -y install socat deltarpm && yum install -y MariaDB-server MariaDB-client在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:mkdir -p /var/log/mariadbtouch /var/log/mariadb/mariadb-slow.logtouch /var/log/mariadb/queries.logchmod 666 /var/log/mariadb/mariadb-slow.logchmod 666 /var/log/mariadb/queries.log第5步: 配置MariaDB数据库的安全性 systemctl status MysqL -l 命令可以查看服务的完整运行状态在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:/usr/bin/MysqL_secure_installationNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it,we'll need the currentpassword for the root user. If you've just installed MariaDB,andyou haven't set the root password yet,the password will be blank,so you should just press enter here.Enter current password for root (enter for none): 刚刚安装的MariaDB没有密码,此处直接回车便可成功连接数据库.OK,successfully used password,moving on...Setting the root password ensures that nobody can log into the MariaDbroot user without the proper authorisation.Set root password? [Y/n] yNew password: 123456Re-enter new password: 123456Password updated successfully!Reloading privilege tables..... Success!By default,a MariaDB installation has an anonymous user,allowing anyoneto log into MariaDB without having to have a user account created forthem. This is intended only for testing,and to make the installationgo a bit smoother. You should remove them before moving into aproduction environment.Remove anonymous users? [Y/n] y... Success!normally,root should only be allowed to connect from 'localhost'. Thisensures that someone cannot guess at the root password from the network.disallow root login remotely? [Y/n] n... Success!By default,MariaDB comes with a database named 'test' that anyone canaccess. This is also intended only for testing,and should be removedbefore moving into a production environment.Remove test database and access to it? [Y/n] y- Dropping test database...... Success!- Removing privileges on test database...... Success!Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.Reload privilege tables Now? [Y/n] y... Success!Cleaning up...All done! If you've completed all of the above steps,your MariaDBinstallation should Now be secure.Thanks for using MariaDB!第6步: 创建MariaDB galera群集需要用到的多个用户Now,we have to createsome users that must be able to access the database. The‘sst_user’is the user which a database node will use for authenticating to another database node in the State Transfer Snapshot (sst) phase. Runthe following command on all nodes:在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:MysqL -uroot -p123456 -h127.0.0.1在db1 MariaDB [(none)]> 和 db2 MariaDB [(none)]> 还有 db2 MariaDB [(none)]>上分别执行如下sql命令:USE MysqL;SHOW DATABASES;SELECT host,user FROM user;DELETE FROM MysqL.user WHERE user='';GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '123456';GRANT USAGE ON *.* to sst_user@'%' IDENTIFIED BY '123456';GRANT ALL PRIVILEGES on *.* to sst_user@'%';FLUSH PRIVILEGES;SELECT host,user FROM user;SHOW VARIABLES LIKE 'character%';SHOW VARIABLES LIKE '%collation%';QUIT建议你使用能够访问数据库的主机名称或者IP地址替代‘%’,因为‘%’ 的意思是允许用户root或者sst_user从任何主机上访问数据库,因此安全性较差.第7步: 修改MariaDB galera群集所有节点的配置文件,设置MariaDB数据库的默认编码格式和表名称的小写格式,配置查询日志和慢查询日志,关闭所有节点的MysqL服务在[root@contoso21 ~]# 和 [root@contoso22 ~]# 还有 [root@contoso23 ~]#上分别执行如下终端命令:service MysqL stop[root@contoso21 ~]# cat > /etc/my.cnf.d/server.cnf## These groups are read by MariaDB server.# Use it for options that only the server (but not clients) should see## See the examples of server my.cnf files in /usr/share/MysqL/## this is read by the standalone daemon and embedded servers[server]# this is only for the MysqLd standalone daemon[MysqLd]character-set-server=utf8lower_case_table_names=1general-log=ONgeneral-log-file=/var/log/mariadb/queries.loglog-output=fileslow-query-log=ONslow-query-log-file=/var/log/mariadb/mariadb-slow.loglong_query_time=1## * galera-related settings#[galera]# Mandatory settingswsrep_on=ONwsrep_provider=/usr/lib64/galera/libgalera_smm.sowsrep_cluster_address='gcomm://'wsrep_cluster_name='galera1_cluster'wsrep_node_address='192.168.10.21'wsrep_node_name='db1'wsrep_sst_method=rsyncbinlog_format=rowdefault_storage_engine=InnoDBinnodb_autoinc_lock_mode=2bind-address=0.0.0.0#wsrep_on=ON#wsrep_provider=#wsrep_cluster_address=#binlog_format=row#default_storage_engine=InnoDB#innodb_autoinc_lock_mode=2## Allow server to accept connections on all interfaces.##bind-address=0.0.0.0## Optional setting#wsrep_slave_threads=1#innodb_flush_log_at_trx_commit=0# this is only for embedded server[embedded]# This group is only read by MariaDB servers,not by MysqL.# If you use the same .cnf file for MysqL and MariaDB,# you can put MariaDB-only options here[mariadb]# This group is only read by MariaDB-10.1 servers.# If you use the same .cnf file for MariaDB of different versions,# use this group for options that older servers don't understand[mariadb-10.1][root@contoso22 ~]# cat > /etc/my.cnf.d/server.cnf## These groups are read by MariaDB server.# Use it for options that only the server (but not clients) should see## See the examples of server my.cnf files in /usr/share/MysqL/## this is read by the standalone daemon and embedded servers[server]# this is only for the MysqLd standalone daemon[MysqLd]character-set-server=utf8lower_case_table_names=1general-log=ONgeneral-log-file=/var/log/mariadb/queries.loglog-output=fileslow-query-log=ONslow-query-log-file=/var/log/mariadb/mariadb-slow.loglong_query_time=1## * galera-related settings#[galera]# Mandatory settingswsrep_on=ONwsrep_provider=/usr/lib64/galera/libgalera_smm.sowsrep_cluster_address='gcomm://192.168.10.21'wsrep_cluster_name='galera1_cluster'wsrep_node_address='192.168.10.22'wsrep_node_name='db2'wsrep_sst_method=rsyncbinlog_format=rowdefault_storage_engine=InnoDBinnodb_autoinc_lock_mode=2bind-address=0.0.0.0#wsrep_on=ON#wsrep_provider=#wsrep_cluster_address=#binlog_format=row#default_storage_engine=InnoDB#innodb_autoinc_lock_mode=2## Allow server to accept connections on all interfaces.##bind-address=0.0.0.0## Optional setting#wsrep_slave_threads=1#innodb_flush_log_at_trx_commit=0# this is only for embedded server[embedded]# This group is only read by MariaDB servers,# use this group for options that older servers don't understand[mariadb-10.1][root@contoso23 ~]# cat > /etc/my.cnf.d/server.cnf## These groups are read by MariaDB server.# Use it for options that only the server (but not clients) should see## See the examples of server my.cnf files in /usr/share/MysqL/## this is read by the standalone daemon and embedded servers[server]# this is only for the MysqLd standalone daemon[MysqLd]character-set-server=utf8lower_case_table_names=1general-log=ONgeneral-log-file=/var/log/mariadb/queries.loglog-output=fileslow-query-log=ONslow-query-log-file=/var/log/mariadb/mariadb-slow.loglong_query_time=1## * galera-related settings#[galera]# Mandatory settingswsrep_on=ONwsrep_provider=/usr/lib64/galera/libgalera_smm.sowsrep_cluster_address='gcomm://192.168.10.21'wsrep_cluster_name='galera1_cluster'wsrep_node_address='192.168.10.23'wsrep_node_name='db3'wsrep_sst_method=rsyncbinlog_format=rowdefault_storage_engine=InnoDBinnodb_autoinc_lock_mode=2bind-address=0.0.0.0#wsrep_on=ON#wsrep_provider=#wsrep_cluster_address=#binlog_format=row#default_storage_engine=InnoDB#innodb_autoinc_lock_mode=2## Allow server to accept connections on all interfaces.##bind-address=0.0.0.0## Optional setting#wsrep_slave_threads=1#innodb_flush_log_at_trx_commit=0# this is only for embedded server[embedded]# This group is only read by MariaDB servers,# use this group for options that older servers don't understand[mariadb-10.1]第8步: 初始化MariaDB galera群集中第一个节点使用专门的参数项‘ --wsrep-new-cluster’来启动MariaDB Gelera群集,只在db1节点(第1个节点)上如此操作,以便群集主要的节点被初始化.[root@contoso21 ~]# /etc/init.d/MysqL start --wsrep-new-cluster[root@contoso21 ~]# MysqL -uroot -p123456 -e"show status like 'wsrep%'"wsrep_local_state_comment | Synced <-- cluster is syncedwsrep_incoming_addresses | 192.168.10.21:3306 <-- node db1 is a providerwsrep_cluster_size | 1 <-- cluster consists of 1 node wsrep_ready | ON <-- good :)[root@contoso21 ~]# /etc/init.d/MysqL start --wsrep-new-clusterStarting MysqL (via systemctl): [ OK ][root@contoso21 ~]# MysqL -uroot -p123456 -e"show status like 'wsrep%'"+------------------------------+---------------------------------------------+| 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 | 1 || wsrep_cluster_size | 1 || wsrep_cluster_state_uuid | b47976ee-1ad6-11e6-b848-c6770ef480cb || wsrep_cluster_status | Primary || wsrep_commit_oooe | 0.000000 || wsrep_commit_oool | 0.000000 || wsrep_commit_window | 0.000000 || wsrep_connected | ON || wsrep_evs_delayed | || wsrep_evs_evict_list | || wsrep_evs_repl_latency | 8.91e-07/6.818e-06/1.9412e-05/6.92271e-06/5 || 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 | b47891c2-1ad6-11e6-b7ef-66d1299a9d50 || wsrep_incoming_addresses | 192.168.10.21: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 | 0 || 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 | b47976ee-1ad6-11e6-b848-c6770ef480cb || wsrep_protocol_version | 7 || wsrep_provider_name | galera || wsrep_provider_vendor | Codership Oy <info@codership.com> || wsrep_provider_version | 25.3.15(r3578) || wsrep_ready | ON || wsrep_received | 2 || wsrep_received_bytes | 140 || 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 |+------------------------------+---------------------------------------------+第9步: 向已经启动的MariaDB galera群集添加另外两个节点db2和db3检查和确认db2和db3两个节点的配置文件/etc/my.cnf.d/server.cnf内部的[galera] 下面配置的所有参数是否正确,db2和db3两个节点的服务就如同像启动普通服务一样去启动MariaDB galera节点服务.[root@contoso22 ~]# service MysqL start通过在db1和db2节点上执行如下命令,观察群集状态中已经变化参数值内容:[root@contoso22 ~]# MysqL -uroot -p123456 -e"show status like 'wsrep%'"至此,你会发现节点db2已被识别,群集的大小已经是2个节点,并且节点db2的IP地址已被列出:wsrep_local_state_comment | Syncedwsrep_incoming_addre sses | 192.168.10.21:3306,192.168.10.22:3306wsrep_cluster_size | 2wsrep_connected | ONwsrep_ready | ON[root@contoso22 ~]# MysqL -uroot -p123456 -e"show status like 'wsrep%'"+------------------------------+--------------------------------------------------+| 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 | b47976ee-1ad6-11e6-b848-c6770ef480cb || wsrep_cluster_status | Primary || wsrep_commit_oooe | 0.000000 || wsrep_commit_oool | 0.000000 || wsrep_commit_window | 0.000000 || wsrep_connected | ON || wsrep_evs_delayed | || wsrep_evs_evict_list | || wsrep_evs_repl_latency | 0.000227382/0.000654379/0.00225715/0.000659168/7 || 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 | 8dc1b4b3-1ad7-11e6-8bf0-9a0cfaca8d40 || wsrep_incoming_addresses | 192.168.10.22:3306,192.168.10.21: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 | 0 || 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.333333 || wsrep_local_send_queue_max | 2 || wsrep_local_send_queue_min | 0 || wsrep_local_state | 4 || wsrep_local_state_comment | Synced || wsrep_local_state_uuid | b47976ee-1ad6-11e6-b848-c6770ef480cb || wsrep_protocol_version | 7 || wsrep_provider_name | galera || wsrep_provider_vendor | Codership Oy <info@codership.com> || wsrep_provider_version | 25.3.15(r3578) || wsrep_ready | ON || wsrep_received | 3 || wsrep_received_bytes | 216 || 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 |+------------------------------+--------------------------------------------------+同样地在节点db3上执行如下2个命令:[root@contoso23 ~]# service MysqL start # [root@contoso23 ~]# MysqL -uroot -p123456 -e"show status like 'wsrep%'"至此,你应该会发现节点db3已被识别,群集的大小已经是3个节点,并且节点db3的IP地址已被列出:wsrep_local_state_comment | Syncedwsrep_incoming_addresses | 192.168.10.22:3306,192.168.10.21:3306,192.168.10.23:3306wsrep_cluster_size | 3wsrep_connected | ONwsrep_ready | ON[root@contoso23 ~]# MysqL -uroot -p123456 -e"show status like 'wsrep%'"+------------------------------+----------------------------------------------------------+| 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 | 3 || wsrep_cluster_size | 3 || wsrep_cluster_state_uuid | b47976ee-1ad6-11e6-b848-c6770ef480cb || wsrep_cluster_status | Primary || wsrep_commit_oooe | 0.000000 || wsrep_commit_oool | 0.000000 || wsrep_commit_window | 0.000000 || wsrep_connected | ON || 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 | 23817fc4-1ad8-11e6-8ec5-3340a442db9a || wsrep_incoming_addresses | 192.168.10.23:3306,192.168.10.22:3306,192.168.10.21: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 | 0 || 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 | b47976ee-1ad6-11e6-b848-c6770ef480cb || wsrep_protocol_version | 7 || wsrep_provider_name | galera || wsrep_provider_vendor | Codership Oy <info@codership.com> || wsrep_provider_version | 25.3.15(r3578) || wsrep_ready | ON || wsrep_received | 3 || wsrep_received_bytes | 284 || 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 |+------------------------------+----------------------------------------------------------+第10步: 测试验证群集的复制功能现在群集正在运行,让我们测试一下它是否能正常工作.在db1节点(contoso21)上创建一个‘clustertest’ 数据库,通过如下命令:[root@contoso21 ~]# MysqL -uroot -p123456 -e 'SELECT * FROM clustertest.mycluster;'[root@contoso21 ~]# MysqL -uroot -p123456 -e 'CREATE DATABASE clustertest;'[root@contoso21 ~]# MysqL -uroot -p123456 -e 'CREATE TABLE clustertest.mycluster ( id INT NOT NULL AUTO_INCREMENT,name VARCHAR(50),birth DATE,PRIMARY KEY(id));'[root@contoso21 ~]# MysqL -uroot -p123456 -e 'INSERT INTO clustertest.mycluster (name,birth) VALUES ("Tim","1989-12-27");'[root@contoso21 ~]# MysqL -uroot -p123456 -e 'SELECT * FROM clustertest.mycluster;'+----+------+------------+| id | name | birth |+----+------+------------+| 3 | Tim | 1989-12-27 |+----+------+------------+[root@contoso22 ~]# MysqL -uroot -p123456 -e 'SELECT * FROM clustertest.mycluster;'+----+------+------------+| id | name | birth |+----+------+------------+| 3 | Tim | 1989-12-27 |+----+------+------------+[root@contoso23 ~]# MysqL -uroot -p123456 -e 'SELECT * FROM clustertest.mycluster;'+----+------+------------+| id | name | birth |+----+------+------------+| 3 | Tim | 1989-12-27 |+----+------+------------+从以上输出的结果我们能断定群集是正常工作的,群集通过了节点db1实现了与所有节点之间的复制操作.当我们群集关闭群集时,按照逆向启动顺序去关闭节点先关闭db3节点,,然后关闭db2节点,最后关闭db1节点当我们再一次启动群集时,按照以下命令顺序启动群集:[root@contoso21 ~]# /etc/init.d/MysqL start --wsrep-new-cluster ## 第1步,第1个节点必须如此启动[root@contoso22 ~]# service MysqL start ## 第2步[root@contoso23 ~]# service MysqL start ## 第3步[root@contoso21 ~]# systemctl status MysqL -l[root@contoso22 ~]# systemctl status MysqL -l[root@contoso23 ~]# systemctl status MysqL -lKeepAlived + HaProxy的高可用性方案配置hostname ip address VIP loadbalance1.com 192.168.100.55 192.168.10.200loadbalance2.com 192.168.100.66 192.168.10.200[root@loadbalance1 ~]# ss -anop | column[root@loadbalance2 ~]# ss -anop | column使用vi命令删除全部被编辑文件的内容第1步:输入 G 光标跳到文件末尾第2步:输入 :1,.d 回车当我们分配一个IP地址192.168.10.200当作虚拟IP地址(VIP)来使用的时候.我们需要做的第一件事情是告诉操作系统的内核,我们计划将IP地址绑定到没有被定义的接口上.为了达到这个目的我们需要编辑配置文件/etc/sysctl.conf,并且在该文件末尾添加如下行:net.ipv4.ip_nonlocal_bind=1[root@loadbalance1 ~]# vi /etc/sysctl.confnet.ipv4.ip_nonlocal_bind=1[root@loadbalance2 ~]# vi /etc/sysctl.confnet.ipv4.ip_nonlocal_bind=1然后,我们需要执行如下命令在不重新启动系统的情况下能够使VIP设置生效:[root@loadbalance1 ~]# sysctl -p[root@loadbalance2 ~]# sysctl -p[root@loadbalance1 ~]# vi /etc/hosts192.168.100.55 loadbalance1.com loadbalance1127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6[root@loadbalance2 ~]# vi /etc/hosts192.168.100.66 loadbalance2.com loadbalance2127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6[root@loadbalance1 ~]# vi /etc/selinux/config# disabled - No SELinux policy is loaded.SELINUX=disabled[root@loadbalance2 ~]# vi /etc/selinux/config# disabled - No SELinux policy is loaded.SELINUX=disabled[root@loadbalance1 ~]# systemctl stop firewalld && systemctl disable firewalld[root@loadbalance2 ~]# systemctl stop firewalld && systemctl disable firewalld[root@loadbalance1 ~]# yum -y install keepalived haproxy[root@loadbalance2 ~]# yum -y install keepalived haproxy[root@loadbalance1 ~]# cat /etc/keepalived/keepalived.conf[root@loadbalance2~]# cat /etc/keepalived/keepalived.conf[root@loadbalance1 ~]# vi /etc/keepalived/keepalived.confglobal_defs {notification_email {14588019@qq.com}notification_email_from 14588019@qq.comsmtp_server localhostsmtp_connect_timeout 30router_id loadbalance1.com}vrrp_script haproxy {script "killall -0 haproxy"interval 2weight 2}vrrp_instance 50 {virtual_router_id 50advert_int 1priority 101state MASTERinterface eno16777736virtual_ipaddress {192.168.10.200 dev eno16777736}track_script {haproxy}}[root@loadbalance2 ~]# vi /etc/keepalived/keepalived.conf global_defs {notification_email {14588019@qq.com}notification_email_from 14588019@qq.comsmtp_server localhostsmtp_connect_timeout 30router_id loadbalance2.com}vrrp_script haproxy {script "killall -0 haproxy"interval 2weight 2}vrrp_instance 50 {virtual_router_id 50advert_int 1priority 99state SLAVEinterface eno16777736virtual_ipaddress {192.168.10.200 dev eno16777736}track_script {haproxy}}[root@loadbalance1 ~]# vi /etc/haproxy/haproxy.cfgglobal chroot /var/lib/haproxy daemon group haproxy log 192.168.100.55 local2 maxconn 4000 pidfile /var/run/haproxy.pid stats socket /var/lib/haproxy/stats user haproxy defaults log global retries 3 timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m listen mariadb-cluster bind 192.168.10.200:3306 mode tcp balance roundrobin server mariadb1 192.168.10.21:3306 server mariadb2 192.168.10.22:3306 server mariadb3 192.168.10.23:3306[root@loadbalance2 ~]# vi /etc/haproxy/haproxy.cfgglobal chroot /var/lib/haproxy daemon group haproxy log 192.168.10.66 local2 maxconn 4000 pidfile /var/run/haproxy.pid stats socket /var/lib/haproxy/stats user haproxy defaults log global retries 3 timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m listen mariadb-cluster bind 192.168.10.200:3306 mode tcp balance roundrobin server mariadb1 192.168.10.21:3306 server mariadb2 192.168.10.22:3306 server mariadb3 192.168.10.23:3306[root@loadbalance1 ~]# vi /etc/default/haproxyENABLED=1[root@loadbalance2 ~]# vi /etc/default/haproxyENABLED=1[root@loadbalance1 ~]# systemctl enable keepalived[root@loadbalance2 ~]# systemctl enable keepalived[root@loadbalance1 ~]# systemctl restart keepalived[root@loadbalance2 ~]# systemctl restart keepalived[root@loadbalance1 ~]# systemctl enable haproxy[root@loadbalance2 ~]# systemctl enable haproxy[root@loadbalance1 ~]# systemctl restart haproxy[root@loadbalance2 ~]# systemctl restart haproxyshow status like 'wsrep%';show variables like 'wsrep_node%';[root@loadbalance1 ~]# cat > /etc/yum.repos.d/MariaDB.repo[root@loadbalance2 ~]# cat > /etc/yum.repos.d/MariaDB.repo[mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/10.1/centos7-amd64gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=1 [root@loadbalance1 ~]# yum -y install MariaDB-client[root@loadbalance2 ~]# yum -y install MariaDB-client[root@loadbalance1 ~]# MysqL -uroot -p123456 -h192.168.10.200 -e"show variables like 'wsrep_node%'"+-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.21 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db1 |+-----------------------------+-----------------+[root@loadbalance1 ~]# MysqL -uroot -p123456 -h192.168.10.200 -e"show variables like 'wsrep_node%'"+-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10 .22 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db2 |+-----------------------------+-----------------+[root@loadbalance1 ~]# MysqL -uroot -p123456 -h192.168.10.200 -e"show variables like 'wsrep_node%'"+-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.23 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db3 |+-----------------------------+-----------------+[root@loadbalance1 ~]# for i in `seq 1 6`doMysqL -uroot -p123456 -h192.168.10.200 -e"show variables like 'wsrep_node%'"done[root@loadbalance1 ~]# for i in `seq 1 6`> do> MysqL -uroot -p123456 -h192.168.10.200 -e"show variables like 'wsrep_node%'"> done+-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.21 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db1 |+-----------------------------+-----------------++-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.22 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db2 |+-----------------------------+-----------------++-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.23 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db3 |+-----------------------------+-----------------++-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.21 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db1 |+-----------------------------+-----------------++-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.22 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db2 |+-----------------------------+-----------------++-----------------------------+-----------------+| Variable_name | Value |+-----------------------------+-----------------+| wsrep_node_address | 192.168.10.23 || wsrep_node_incoming_address | AUTO || wsrep_node_name | db3 |+-----------------------------+-----------------+配置haproxy日志功能[root@loadbalance1 ~]# vi /etc/rsyslog.conf# Provides UDP syslog reception$ModLoad imudp$UDPServerRun 514local2.* /var/log/haproxy.log[root@loadbalance1 ~]# vi /etc/sysconfig/rsyslogSYSLOGD_OPTIONS="-r -m 0"[root@loadbalance1 ~]# systemctl restart rsyslog[root@loadbalance1 ~]# tail -f /var/log/haproxy.log

如何在CentOS 7系统上配置高可用的MariaDB Galera Cluster多主群集的更多相关文章

  1. ios – 使用Swift的Lumberjack 2.0记录器

    我以前使用物镜C的Lumberjack记录器,我喜欢它.现在我开始学习Swift,我不能在那里使用我最喜欢的记录器.有人可以一步一步地写出我能做到的事吗?在Lumberjack2.0发布之前,我尝试在这里找到一些东西,但所有主题都是自定义包装器.我做了什么:>我用Cocoapods添加了Lumberjack;>我将“#import”添加到Bridging-Header文件中.我不知道接下来该怎么办?因为在ObjC中我有宏:staticconstintddLogLevel=LOG_LEVEL_INFO;el

  2. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  3. Swift设计模式之命令模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  4. Ceph部署二RGW搭建

    背景CephRGW简介CephRGW基于librados,是为应用提供RESTful类型的对象存储接口。环境规划如上篇文章《Ceph部署(一)集群搭建》所述:4台服务器:1台作为Monitor,1台作为OSDRGW,还有两台作为OSD。部署CephRGW进入上文所述的my-cluster目录。该脚本会连接RGW,创建一个bucket并列出所有的bucket。正常的输出应该为:小结通过ceph-deploy命令,已经大大地简化了对Ceph集群和RGW的安装和配置。但如果想挑战下自己,或者想让自己了解更多,试

  5. Swift 接入微信 Mars_Xlogger 填坑指南——Jinkey 原创

    Step1下载代码使用gitclone或者直接下载zip,解压后进入目录mars-master/mars/libraries,看到有一个build_apple.py的文件Step2编译Mars在终端进入工程目录输入然后回答一系列问题第一个问题inputprefixforsavedirectory.liketrunk,br,tag:输入保存目录的前缀第二个问题Entermenu:buildmarsforiphone.buildmarsforiphonewithbitcode.buildxlogforipho

  6. EFColorPicker - 一个纯 Swift 的轻量级 iOS 颜色选择器

    EFColorPicker是一个纯Swift的轻量级iOS颜色选择器,受MSColorPicker启发。或执行以下命令:环境iOS8.0+Xcode9.0+Swift4.0+安装EFColorPicker可以通过CocoaPods进行获取。只需要在你的Podfile中添加如下代码就能实现引入:备注EFColorPicker的第一个版本从MSColorPicker转换而来,在此对MSColorPicker的作者sgl0v表示感谢!作者EyreFree,eyrefree@eyrefree.org协议EFQRC

  7. 使用LLDB调试Swift

    LLDB是个很好的选择。接下来我会探讨一些工作中常用到的一些LLDB调试技巧。LLDB拥有大量有用的调试工具。LLDB的bugreport命令可以生成一份详细的app当前状态的报告。这些命令有针对C++,Objective-C,Swift和RenderScript的。使用LLDB的这些命令可以让调试变得更自动化。process用于控制要调试的进程,可把LLDB依附到特定target或从target上解绑。processstatus用于打印当前进程及断点处的相关信息:使用如下命令可继续执行:这等同于Xcod

  8. 如何在swift-ios文件中使用asl.h

    我是ios/swift的新手.我想使用asl.h中的日志记录c函数在swift文件中.任何人?我用Google搜索,人们似乎都在编写自己的日志快速类.没有不尊重,但我想使用asl.也就是说,斯威夫特不喜欢#include并且它不喜欢我只是调用asl_log(NULL,NULL,ASL_LEVEL_INFO,“HelloWorld!”

  9. android – 来自adb的’grep’命令的问题

    当我用adb写的时候:我得到错误输出:但如果我将它拆分为两个操作符:它工作正常.如果唯一的方法是将它拆分为两个–首先进入adbshell,然后运行Inquire,有一种方法可以从c#中执行此操作吗?

  10. android – 交互式设置屏幕设置

    我想在KitKat中将屏幕锁定模式设置为None,这样我就可以运行CTS了.我正在使用DragonBoardAPQ8074进行Intrinsyc的开发,他们刚刚发布了针对AndroidKitKat4.4.2的BSP.麻烦的是,它不稳定,设置中的安全菜单崩溃了.所以我不能使用adbshell来输入keyevents19,20,21,22,23进行导航.adbshellsettings命令似乎应该适用

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部