image.png

1.环境说明

name ip 备注
node1 192.168.44.100 master节点
node2 192.168.44.200 node节点
node3 192.168.44.22 node节点

都是centos7.5.1804

2.题目要求

概述: MariaDB Galera Cluster 是 一 套 在 mysql innodb 存 储 引 擎 上 面 实 现 multi-master 及数据实时同步的系统架构,业务层面无需做读写分离工作,数据 库读写压力都能按照既定的规则分发到各个节点上去。在数据方面完全兼容 MariaDB 和 MySQL。
主要功能:
(1)同步复制
(2)真正的 multi-master,即所有节点可以同时读写数据库
(3)自动的节点成员控制,失效节点自动被清除
(4)新节点加入数据自动复制
(5)真正的并行复制,行级
(6)用户可以直接连接集群,使用感受上与 MySQL 完全一致

3.基础环境准备

  1. 修改主机名,修改/etc/hosts文件
  2. 关闭firewalld,selinux,清空iptables
  3. 准备好yum源,即文件
  4. 保证主机连通性

    一:高可用集群搭建

    1.安装数据库及galrea

    分别在三台主机上安装
    1. # yum install -y MariaDB-server galera MySQL-python

    2.初始化数据库

    三台主机同样操作 ``` [root@node1 ~]# systemctl start mariadb
    [root@node1 ~]# mysql_secure_installation NOTE: 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 current password for the root user. If you’ve just installed MariaDB, and you 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): 默认按回车 OK, successfully used password, moving on… Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation.

    systemctl start mariadb

    mysql_secure_installation

    NOTE: 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 current password for the root user. If you’ve just installed MariaDB, and you 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): 默认按回车 OK, successfully used password, moving on… Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Normally, root should only be allowed to connect from ‘localhost’. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] n 按 n … skipping. By default, MariaDB comes with a database named ‘test’ that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y 按 y
  • Dropping test database… … Success!
  • Removing privileges on test database… … Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y 按 y … Success! Cleaning up… All done! If you’ve completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
    1. <a name="gb1DO"></a>
    2. ## 3.配置数据库文件
    3. 在正确下载mariadb服务与galrea服务后会在/eetc/my.cnf.d/下面有一个server.cnf文件,修改这个文件来配置高可用<br />三个节点配置格式相同但要修改wsrep_node_name,wsrep_node_address,bind-address,wsrep_sst_method,wsrep_causal_reads,等字段
    [root@node1 my.cnf.d]# vi server.cnf …… [galera]

    Mandatory settings

    wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address=”gcomm://192.168.44.100,192.168.44.200,192.168.44.22” #node的ip binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=3 #添加以下两行 wsrep_node_name=node1 #身处那个节点就填那个节点 wsrep_node_address=192.168.44.100 #同上 #

    Allow server to accept connections on all interfaces.

    # bind-address=192.168.44.100 #同上 #

    Optional setting

    wsrep_slave_threads=1 innodb_flush_log_at_trx_commit=0 #添加以下三行 innodb_buffer_pool_size=120M #设置缓存大小 wsrep_sst_method=rsync #处理方法=再同步
    wsrep_causal_reads=ON #关系读=开启

this is only for embedded server

……

  1. <a name="CjOiw"></a>
  2. ## 4.启动数据库集群
  3. 在启动数据库集群是在不同的节点使用不同的命令<br />在node1节点(相当于主节点):

[root@node1 ~]# galera_new_cluster

  1. node2node3节点:

[root@node2 ~]# systemctl restart mariadb [root@node3 ~]# systemctl restart mariadb

  1. <a name="W5NEh"></a>
  2. ## 5.验证
  3. 1. 在***所有节点***上查看3306与4567端口是否开启,这是查看服务是否都正常运行的方法

[root@node1 ~]# netstat -nulpt ….. tcp 0 0 192.168.44.100:3306 0.0.0.0: LISTEN 1831/mysqld
tcp 0 0 0.0.0.0:22 0.0.0.0:
LISTEN 905/sshd
tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 1831/mysqld

  1. 2. node1节点上创建一个库然后再其他节点看存不存在
  2. 2. node1节点查看状态

MariaDB [(none)]> show status like ‘wsrep%’; +———————————————-+——————————————————————————————+ | Variable_name | Value | +———————————————-+——————————————————————————————+ | wsrep_applier_thread_count | 1 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 1.000000 | | wsrep_causal_reads | 2 | | wsrep_cert_deps_distance | 1.000000 | | wsrep_cert_index_size | 1 | | wsrep_cert_interval | 0.000000 | | wsrep_cluster_conf_id | 6 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | a478d110-4110-11ec-9284-822742c26ecb | | wsrep_cluster_status | Primary | | wsrep_cluster_weight | 3 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 1.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 | a4784632-4110-11ec-a5d6-ce7642949a0a | | wsrep_incoming_addresses | 192.168.44.100:3306,192.168.44.200:3306,192.168.44.22:3306 | | wsrep_last_committed | 1 |

  1. <a name="S90Qs"></a>
  2. # 二:负载均衡搭建
  3. <a name="iE5EO"></a>
  4. ## 1.环境介绍
  5. 用上面搭建的mariadb cluster
  6. | name | ip | 备注 |
  7. | --- | --- | --- |
  8. | node1 | 192.168.44.100 | 安装并开启HAproxy |
  9. | node2 | 192.168.44.200 | node节点 |
  10. | node3 | 192.168.44.22 | node节点 |
  11. <a name="qrRlD"></a>
  12. ## 2.负载均衡插件
  13. 1. HAProxy 具备媲美商用负载均衡器的性能和稳定性
  14. 1. keepalived 是集群管理中保证集群高可用的一个服务软件,其功能类似于 heartbeat,用来防止单点故障。 keepalived 是 以 VRRP 协 议 为 实 现 基 础 的 , VRRP 全 称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议
  15. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/23046225/1636453074872-f3f1584d-23a6-4e69-8b73-18befee709ab.png#clientId=u0665ca5d-150e-4&from=paste&id=uc272deb1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=530&originWidth=998&originalType=binary&ratio=1&size=180020&status=done&style=shadow&taskId=ud49fc43e-df9d-4050-82cb-393feb47146)<br />keepalived提供一个虚拟ip地址, keepalived 提供心跳检测服务 ,如果user指向了的某一个节点当这个节点出现问题时虽然集群还能正常工作但user与节点断开了联系,想连上要通过手动指向未出问题的节点,这时候keepalived就发挥作了,他产生一个固定的虚拟ip在节点间浮动,当一个节点出现问题这个虚拟ip就跑到没有问题的那个节点上
  16. 这是在网上找的一张架构图这样一看就很好理解了,图中使用的是lvs我们使用的是HAproxy来解决负载均衡
  17. <a name="sDTRJ"></a>
  18. ## 3.案例目标
  19. 案例目标 <br />(1)熟悉 HAproxy 与 Keepalived 组件的作用、功能、使用场景等 <br />(2)熟悉 Mariadb Cluster+HAproxy+Keepalived 的架构与原理 <br />(3)能够搭建高可用数据库集群<br />
  20. <a name="FtCbs"></a>
  21. ## 4.安装负载均衡插件HAproxy
  22. 安装方法有很多这里我省事通过yum进行安装

[root@node1 ~]# yum install -y haproxy

[root@node2 ~]# yum install -y haproxy

[root@node3 ~]# yum install -y haproxy

  1. (我感觉在这题中在nide1 节点安装HAproxy就行了)
  2. <a name="Q2MDh"></a>
  3. ## 5.修改HAproxy配置文件
  4. yum下载后文件的默认存放路径是:/etc/haproxy/haproxy.cfg

global log 127.0.0.1 local2

  1. chroot /var/lib/haproxy
  2. pidfile /var/run/haproxy.pid
  3. maxconn 4000
  4. user haproxy
  5. group haproxy
  6. daemon
  7. # turn on stats unix socket
  8. stats socket /var/lib/haproxy/stats

defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000

listen stats #添加以下两端 bind 192.168.44.100:9000 #ip端口是通过浏览器访问的地址 mode http
stats enable stats uri /stats stats auth admin:admin stats admin if TRUE

listen mariadb balance roundrobin mode tcp option tcplog option tcpka bind 192.168.44.100:3307 #监听端口,可以通过这个端口进行轮循访问 server node1 192.168.44.100:3306 check weight 1 #node节点的数据库端口。因为是做了集群的所以 server node2 192.168.44.200:3306 check weight 1 可以通过监听端口来获取信息 server node3 192.168.44.22:3306 check weight 1

  1. ```
  2. 启动haproxy
  3. [root@node1 ~]# systemctl restart haproxy

查看端口是否开启:
查看3306,3307,9000,4567是否正常开启
当看到端口正常开启后再浏览器通过ip+9000端口进行访问
image.png
回到 HAProxy 负载均衡服务的使用,现在对于使用者而言,统一窗口是 192.168.200.11 :3307,HAProxy 会把工作分散到不同台的 node1,node2,node3

6.验证

数据库的默认server_id都是1,这里我们三个数据库设置成不同的id

  1. [root@node1 ~]# mysql -h 192.168.200.11 -uroot -p000000 -e "SET GLOBAL server_id=1"
  2. [root@node1 ~]# mysql -h 192.168.200.12 -uroot -p000000 -e "SET GLOBAL server_id=2"
  3. [root@node1 ~]# mysql -h 192.168.200.13 -uroot -p000000 -e "SET GLOBAL server_id=3"

在安装HAproxy节点通过3307端口访问。但需要在各个节点上进行给登陆用户授权

  1. [root@node2 haproxy]# mysql -uroot -p000000
  2. Welcome to the MariaDB monitor. Commands end with ; or \g.
  3. Your MariaDB connection id is 23
  4. Server version: 10.3.23-MariaDB MariaDB Server
  5. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
  6. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  7. MariaDB [(none)]> grant all privileges on *.* to root@'%' identified by '000000' ;

通过3307端口查看负载均衡情况

  1. [root@node1 ~]# mysql -h 192.168.44.100 -P 3307 -uroot -p000000 -e "show variables like 'server_id'"
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | server_id | 2 |
  6. +---------------+-------+
  7. [root@node1 ~]# mysql -h 192.168.44.100 -P 3307 -uroot -p000000 -e "show variables like 'server_id'"
  8. +---------------+-------+
  9. | Variable_name | Value |
  10. +---------------+-------+
  11. | server_id | 3 |
  12. +---------------+-------+
  13. [root@node1 ~]# mysql -h 192.168.44.100 -P 3307 -uroot -p000000 -e "show variables like 'server_id'"
  14. +---------------+-------+
  15. | Variable_name | Value |
  16. +---------------+-------+
  17. | server_id | 1 |
  18. +---------------+-------+

可以看到每次访问的数据库节点发生了变化,验证 HAProxy 负载均衡服务成功

三:高可用搭建

1.环境说明

这些可以接着上面的做我将上面的三台主机的集群减成两台主机的集群,并弄了两个两台主机的集群(根据情况变化)

name ip 备注
node1 192.168.44.100 安装HAproxy,keepalived
node2 192.168.44.20 被node1的HAproxy链接
node3 192.168.44.22 安装HAproxy,keepalived
node4 192.168.44.11 被node3的HAproxy链接

node1与node2链接起来是一个小集群,node3与node4连起来是一个小集群。node1与node3安装配置keepalived是高可用,node1与node2安装haproxy是负载均衡,node3与node4安装haproxy是负载均衡。
image.png

2.安装并配置keepalived

我通过yum的方式安装

  1. [root@node1 ~]# yum install -y keepalived
  2. [root@node3 ~]# yum install -y keepalived

修改keepalived的配置文件 /etc/keepalived/keepalived.conf

  1. ### 主要修改这部分
  2. ### master节点部分
  3. vrrp_instance VI_1 {
  4. state MASTER #master节点还是backup节点
  5. interface ens32 #网卡名称,要保证两者可以通信
  6. virtual_router_id 33 #两者要在同一id中
  7. priority 150 #权重比,谁大谁先
  8. advert_int 1
  9. authentication {
  10. auth_type PASS #账号和密码默认就行
  11. auth_pass 1111
  12. }
  13. virtual_ipaddress {
  14. 192.168.44.111 #虚拟ip这个两者要相同
  15. }
  16. }
  17. ### backup部分
  18. vrrp_instance VI_1 {
  19. state BACKUP #这个点要注意
  20. interface ens32
  21. virtual_router_id 33
  22. priority 100
  23. advert_int 1
  24. authentication {
  25. auth_type PASS
  26. auth_pass 1111
  27. }
  28. virtual_ipaddress {
  29. 192.168.44.111
  30. }
  31. }

此时就有一个虚拟ip了
image.png

3.配置HAproxy文件

配置负载均衡的时候并没有实现高可用当一个节点死掉后是无法自动切换到备用节点的,所以要完善HAproxy配置文件
image.png

  1. ###node1的HAproxy的配置##############################################
  2. ......
  3. listen stats
  4. bind 192.168.44.111:9000
  5. mode http
  6. stats enable
  7. stats uri /stats
  8. stats auth admin:admin
  9. stats admin if TRUE
  10. listen mariadb
  11. balance roundrobin
  12. mode tcp
  13. option tcplog
  14. option tcpka
  15. bind 192.168.44.111:3307
  16. server node1 192.168.44.100:3306 check weight 1
  17. server node2 192.168.44.200:3306 check weight 1
  18. ###node3的HAproxy的配置################################################
  19. ......
  20. listen stats
  21. bind 192.168.44.111:9000
  22. mode http
  23. stats enable
  24. stats uri /stats
  25. stats auth admin:admin
  26. stats admin if TRUE
  27. listen mariadb
  28. balance roundrobin
  29. mode tcp
  30. option tcplog
  31. option tcpka
  32. bind 192.168.44.111:3307
  33. server node1 192.168.44.22:3306 check weight 1
  34. server node2 192.168.44.11:3306 check weight 1

重启:
这个地方重启特别注意,不知道是我的配置原因还是本事的机制原因就是这样
当VIP在node1是修改HAproxy 配置文件后紧接着重启,让其保持running状态,然后将keepalived服务关掉让VIP跑到node3节点,然后修改HAproxy文件修改完后重启HAproxy服务让其保持running状态,然后再将nide1的keepalived服务开启让VIP回到node1上,如果配置没啥问题就不要随便重启没有VIP的node这样HAproxy会出错。!!!

4.验证

上述步骤完成后接下来验证

  1. 首先看要开的端口是否都正常开启:3306, 3307,9000, 4568
  2. 用VIP+端口登陆数据库(情况iptables,授权等工作要做好) ```bash
    #VIP在谁呢里就会访问到那个集群
    访问之前iptables要-F一下

[root@node1 ~]# mysql -h 192.168.44.111 -P 3307 -uroot -p000000 -e “show variables like ‘server_id’” +———————-+———-+ | Variable_name | Value | +———————-+———-+ | server_id | 1 | +———————-+———-+ [root@node1 ~]# mysql -h 192.168.44.111 -P 3307 -uroot -p000000 -e “show variables like ‘server_id’” +———————-+———-+ | Variable_name | Value | +———————-+———-+ | server_id | 2 | +———————-+———-+

[root@node3 haproxy]# mysql -h 192.168.44.111 -P 3307 -uroot -p000000 -e “show variables like ‘server_id’” +———————-+———-+ | Variable_name | Value | +———————-+———-+ | server_id | 3 | +———————-+———-+ [root@node3 haproxy]# mysql -h 192.168.44.111 -P 3307 -uroot -p000000 -e “show variables like ‘server_id’” +———————-+———-+ | Variable_name | Value | +———————-+———-+ | server_id | 4 | +———————-+———-+

``` 到此差不多完毕了

其实这个思路并不完美,这两个小集群数据没有配置数据同步