首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb Galera Cluster-2

利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb Galera Cluster-2

开启 Cluster 节点的相互通信要使得 Mariadb Galera Cluster                的节点能够进行数据同步,各节点之间必须能够互相通信。这需要各节点能够解析彼此的域名并能访问相应的网络端口。因为 cluster 中节点的域名和 IP                地址是因具体环境而异的,因此将这些信息定义在 environment 文件里。
清单 5. environments/test.json,定义 cluster 成员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "name": "test",
  "description": "",
  "cookbook_versions": {
    },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "mariadb-galera-cluster": {
        "cluster": {
                "members": {
                        "nodeA": "10.0.0.11",
                        "nodeB": "10.0.0.12"
                },
                "master": "nodeA"
        }
}
}




清单 6. recipes/default.rb,域名解析和开启端口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
node['mariadbp4']['cluster']['members'].each_pair do |name, ip|
        bash "Resolve #{name} to #{ip}." do
                user "root"
                group "root"
                code <<-EOF
                name=#{name}
                echo "#{ip} ${name%%.*} $name" >> /etc/hosts
                EOF
                not_if "[ #{name} == `hostname -s` ]"
        end
end

bash "Open ports on OS firewall"
    user "root"
    group "root"
    code <<-EOF
    firewall-cmd --zone=public --add-service=mariadb --permanent
    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --zone=public --add-port=4567/tcp --permanent
    firewall-cmd --zone=public --add-port=4568/tcp --permanent
    firewall-cmd --zone=public --add-port=4444/tcp --permanent
    firewall-cmd --zone=public --add-port=4567/udp --permanent
    firewall-cmd --reload
     EOF
end




配置 Mariadb Galera Cluster在 Mariadb 中开启 Galera Cluster                需要修改相应的配置文件,通常是/etc/my.cnf.d/server.cnf。这里将所需配置预先定义为                template,然后用它覆盖原来的配置文件,如清单 7、清单 8 所示。
清单                7. templates/default/server.cnf.erb,Mariadb 配置文件
1
2
3
4
5
6
7
8
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://<%= @node.mariadbp4.cluster.members.keys.join(',') %>
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0




清单 8. recipes/default.rb,修改 Mariadb 配置文件
1
2
3
4
5
6
7
template "/etc/my.cnf.d/server.cnf" do
        source "server.cnf.erb"
        owner "root"
        mode 0644
        action :create
        not_if "grep '^wsrep_on=ON' /etc/my.cnf.d/server.cnf"
end




修改操作系统服务在 RHEL7 的中,操作系统服务是通过 systemd 来管理的,因为 Mariadb Galera Cluster 需要修改启动 Mariadb                时的参数,因此需要对 systemd 启动 Mariadb 时所使用的命令进行修改。因为 Mariadb Galera Cluster                对第一个启动的节点(又称为 master 节点)需要采用特定的启动命令,因此这里准备两份 systemd 的配置文件,如清单 9、清单 10                所示。在 recipe 中,首先判断当前节点是否 master 节点,然后用相应的配置文件作为当前节点的 systemd 的 Mariadb                服务启动配置文件。最后重启 Mariadb 服务。
清单 9. templates/default/systemd.master.conf.erb,master                节点的配置文件
1
2
3
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --wsrep-new-cluster




清单 10. templates/default/systemd.master.conf.erb,slave                节点的配置文件
1
2
3
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --wsrep_cluster_address=gcomm://<%= node.mariadbp4.cluster.master =%>




清单 11. recipes/default.rb,修改 systemd 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
master=node['mariadbp4']['cluster']['master']
bash "Add cluster conf for mariadb service in systemd and restart service..." do
        cwd "/etc/systemd/system"
        user "root"
        code <<-EOF
        if [ ! -d "$service_name.d" ]; then
                mkdir "mariadb.service.d"
        fi

        if [ `hostname -s` == #{master} ]; then
                mv /tmp/master.conf mariadb.service.d/cluster.conf
        else
                mv /tmp/slave.conf mariadb.service.d/cluster.conf
        fi
        systemctl daemon-reload
        systemctl restart $service_name
        EOF
        not_if "[[ -f mysql.service.d/cluster.conf || -f mariadb.service.d/cluster.conf ]]"
end




安装首先将上面所定义部署流程上传到 Chef Server,包括 cookbook 和 environment。然后告诉 Chef Server                在目标机器上执行相应的部署流程,如清单 12 所示。这里 10.0.0.11 和 10.0.0.12 为组成 Cluster 的两台机器的                IP,注意执行命令时请确保当前目录为 mariadb-galera-cluster 的上级目录,
清单 12. 安装 Mariadb Galera Cluster 所需命令
1
2
3
4
knife cookbook upload -a -o .
knife environment from file environments/test.json
knife bootstrap 10.0.0.11 -x root -P password -r "recipe[mariadb-galera-cluster]" -E test
knife bootstrap 10.0.0.12 -x root -P password -r "recipe[mariadb-galera-cluster]" -E test




验证要验证 Mariadb Galera Cluster 的运行状况,可以通过执行如清单 13 所示的命令来实现。如果一切正常,可以看到如图 1                所示的结果。
清单 13. 查看 Mariadb Galera Cluster 的运行情况
1
2
mysql --user=root --password=xxx
show status like 'wsrep_%'




图                1. Mariadb Galera Cluster 的运行状态小结在企业级的应用中,数据库的高可用性是不可或缺的,而 Mariadb Galera Cluster 作为 Mariadb 自带的 Cluster                功能,从功能上可以满足用户的这一要求。而本文所描述的自动化部署步骤,可以快速的帮助用户在多个节点上部署 Mariadb Galera                Cluster,极大的节省了创建 Mariadb Galera Cluster 所需的时间。
返回列表