Mariadb+Galera高可用集群

实验环境为四台机器:

分别是
ansible母主机:192.168.200.7
node1子主机:192.168.200.15
node2子主机:192.168.200.24
node3子主机:192.168.200.14



文章目录

  • Mariadb+Galera高可用集群
  • 特点
  • 一、环境布置
  • 二、开始编写playbook
  • 1.创建角色目录
  • 2、开始写入接口文件



特点

1. 同步复制
2. 可以在任意节点上进行读写
3. 自动控制成员,自动删除故障节点
4. 自动加入节点
5. 真正给予行级别的并发复制
6. 调度客户连接
Galera能够实现MySQL/MariaDB数据库的主主复制和多主复制等模式,这些复制模式 都是同步进行的,同步时间非常短。 每一个节点都可以同时写入和读取,当某一节点发生故障时,可自动从集群中自动剔 除。HAProxy能提供负载均衡和故障判断等功能解决服务器系统存在的单点故障。 Keepalived能提供客户端连接数据库时使用的虚拟IP地址(VIP)。


提示:以下是本篇文章正文内容,下面案例可供参考

一、环境布置

Ansible母主机开始安装ansible然后开始进行配置文件
创建目录exam作为ansible的工作目录
分发三台主机作为母主机的子主机,分别为node1、node2、node3
Ansible:

yum install -y ansible
mkdir /root/exam
cd /root/exam
vim ansible.cfg  #配置文件
[defaults]
inventory = /root/exam/inventory
roles_path = /root/exam/roles
remote_user = root
ask_pass = false
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
:wq
配置主机和主机组
vim inventory
[dev]
node1
[test]
node2
[prod]
node3

二、开始编写playbook

1.创建角色目录

mkdir /root/exam/roles
cd /root/exam/roles
ansible-galaxy init mariadb-galera-cluster
cd mariadb-galera-cluster
vim tasks/main.yaml
- name: install packages
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - mariadb
    - mariadb-server
    - galera.x86_64
    - mariadb-server-galera
    - java-1.8.0-openjdk.x86_64
    - java-1.8.0-openjdk-devel.x86_64 
- name: use template
  template:
       src: mariadb-server.cnf.j2
       dest: /etc/my.cnf.d/mariadb-server.cnf
  when: "'dev' in group_names"
- name: use templaste
  template:
    src: mariadb-server2.cnf.j2
    dest: /etc/my.cnf.d/mariadb-server.cnf
  when: "'test'in group_names" 
- name: use template
  template:
       src: mariadb-server2.cnf.j2
       dest: /etc/my.cnf.d/mariadb-server.cnf
  when: "'prod' in group_names"
- name: start galera
  shell: '/bin/galera_new_cluster'
  when: "'dev' in group_names"

- name: start mariadb service
  service:
      name: mariadb
      state: started
      enabled: yes
  when: "'test' in group_names"
- name: set mysqluser
  mysql_user:
        name: root
        password: "123456"
        state: present
  when: "'test' in group_names"
  
- name: start mariadb service
  service:
      name: mariadb
      state: started
      enabled: yes
  when: "'prod' in group_names"
    
- name: set mysqluser
  mysql_user:
        name: root
        password: "123456"
        state: present
  when: "'prod in group_names"
cd /root/exam/roles/mariadb-galera-cluster/template
cp -rfv /etc/my.cnf.d/mariadb-server.cnf .
mv mariadb-server.cnf mariadb-server.cnf.j2
cp -rfv mariadb-server.cnf.j2 mariadb-server2.cnf.j2
vim mariadb-server.cnf.j2
在galera栏里面写入如下配置:
[galera]
wsrep_on=ON  #节点已经开启
wsrep_provider=/usr/lib64/galera/libgalera_smm.so #启用galera模块
wsrep_cluster_address=gcomm://     #指定集群中节点的IP
binlog_format=row    #二进制日志格式必须为行
default_storage_engine=InnoDB   #存储引擎(只支持InnoDB)
innodb_autoinc_lock_mode=3 #总结点数量(视自己情况而定,算上主节点)
bind-address=0.0.0.0 #绑定本机的所有IP
wsrep_cluster_name="Mariadb_Galera_Cluster" #集群的名字
wsrep_node_address="{{ ansible_default_ipv4.address }}" #节点的IP
wsrep_sst_method=rsync  #集群使用rsync同步方式

wsrep_cluster_address=gcomm://这个配置,gcomm://是一个特殊的参数,在启动第一台数据库时需要使用这个参数来启动,否则会启动失败,后面的节点使用wsrep_cluster_address="gcomm://节点IP"这个参数来启动数据库,当第一台数据库需要重启时需要切换到 wsrep_cluster_address="gcomm://节点IP"这个参 数来启动才能加入到集群中。这样讲有点抽象,换一种方式来讲就是最开始 启动集群的第一台服务器时将 wsrep_cluster_address="gcomm://节点IP"这一行 注释掉,使用下面那个参数来启动,后面的节点注释掉 wsrep_cluster_address=gcomm://这个参数启动数据库,加入到集群中 来。当集群全部起来以后万一第一台数据库要重启时将下面那条参数注释 掉,开启上面那条参数。这样就能加入集群中来。

vim mariadb-server2.cnf.j2
[galera]
wsrep_on=ON  #节点已经开启
wsrep_provider=/usr/lib64/galera/libgalera_smm.so #启用galera模块
wsrep_cluster_address=gcomm://{{ hostvars['node1'].ansible_default_ipv4.address }},{{ hostvars['node2'].ansible_default_ipv4.address }},{{ hostvars['node3'].ansible_default_ipv4.address }}    #指定集群中节点的IP
binlog_format=row    #二进制日志格式必须为行
default_storage_engine=InnoDB   #存储引擎(只支持InnoDB)
innodb_autoinc_lock_mode=3 #总结点数量(视自己情况而定,算上主节点)
bind-address=0.0.0.0 #绑定本机的所有IP
wsrep_cluster_name="Mariadb_Galera_Cluster" #集群的名字
wsrep_node_address="{{ ansible_default_ipv4.address }}" #节点的IP
wsrep_sst_method=rsync  #集群使用rsync同步方式

2、开始写入接口文件

cd /root/exam/
vim interface.yaml
- hosts: all
- name: use roles
  hosts: all
  roles:
     - mariadb-galera-cluster

开始跑脚本:

ansible-playbook interface.yaml --syntax-check #检查一下语法有没有错误

如果有错误就去检查,没错误就直接开始跑

ansible-playbook interface.yaml