利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb

简介

Chef

Chef 提供了一套自动化安装和配置软件的工具。它允许开发者以模块化的方式(cookbook)来定义软件的安装和配置流程(recipe),以及流程中的可定制参数(attribute)。当需要在特定的环境中创建软件服务时,用户指定模块名称以及相应的参数值,Chef 会负责在目标环境中执行预定义的安装和配置流程。

使用 Chef 需要安装 Chef Server 以及 Chef Development Kit(ChefDK)。Chef Server 负责保存开发者提供的软件安装和配置流程定义,并在目标机器上执行。ChefDK 则是开发者用来定义软件安装和配置流程的工具。

Mariadb Galera Cluster

Mariadb Galera Cluster 是 Mariadb 提供的一种同步多主节点的集群模式。这种模式与传统的 Maraidb Replication 功能的区别主要在于:

  • Galera Cluster 中的所有节点都在提供数据库服务。而 Replication 模式下只有一个主节点在提供数据库服务,其余的 Slave 节点虽然与主节点进行数据同步,但在其成为主节点之前并不提供数据库服务。
  • Galera Cluster 下的数据库操作都是同步的,也就是当一个事务结束时,所有节点上都已经包含了这一事务所做的修改。换言之,在任何一个时刻,集群中每个节点上的数据都是同步的。而在传统的 Replication 模式下,主从节点的数据同步是独立于修改数据的事务,同步通常存在一定的时间延迟。

部署准备

准备工作主要包括:

  • 准备至少三台机器并安装 RHEL(Red Hat Enterprise Linux)操作系统。这里的机器可以是物理机也可以是虚拟机。本文所使用的 RHEL 版本为 7.0,若使用 6.x 及以下版本,所使用的命令会略有不同。可以到Redhat 官网下载安装介质。
  • 下载 Mariadb Galera Cluster 的安装介质。推荐使用 Mariadb10.1 以上的版本,因为从这一版本开始,Galera Cluster 已经被包含在 Mariadb Server 的安装介质中,而在以前的版本中则是作为独立的安装包下载的。可以从Mariadb 官网下载。
  • 在一台机器上安装 Chef Server 以及 ChefDK,建议使用 Chef Server 12.6 和 ChefDK 0.14 及以上版本,安装介质可以从Chef 官网下载。
  • 在 Chef Server 所在的机器上配置 yum 源以及 HTTP Server。这主要是针对在无法访问 Internet 的环境下,能利用自己设立的 yum 源方便的安装软件。HTTP Server 可以使用 RHEL 自带的 Apache HTTP Server,或其他同类软件。

自动安装流程

本文所描述的自动安装流程的目标是在至少两台机器上安装 Mariadb Galera Cluster,主要包含如下几个步骤:

  1. 添加 Chef Server 上提供的 yum 源并安装 Mariadb。
  2. 开启 Cluster 节点之间的互相通信,主要是在操作系统上配置域名解析以及开放相应的防火墙端口。
  3. 开启 Galera Cluster。
  4. 修改操作系统上的 Mariadb 服务启动方式。注意虽然 Galera Cluster 里所有节点都可以同时提供数据库服务,但依照它们被加入 Cluster 的时间顺序,第一个节点的启动方式和其余节点有所不同。

详细实现

首先创建一个名为 mariadb-galera-cluster 的 cookbook 和名为 test.json 的 environment 文件,如清单 1 所示。创建 cookbook 会在当前目录下生成一个同名的目录,后续定义的大部分文件都放在这个目录下。environment 文件将包含所有针对当前环境的参数值,例如当前环境下节点的 IP 地址和域名。创建完成后的目录结构如清单 2 所示。

清单 1. 创建 cookbook 和 environment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
knife cookbook create mariadb-galera-cluster
cat environments/test.json <<EOF
{
  "name": "test",
  "description": "",
  "cookbook_versions": {
 
  },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
 
  },
  "override_attributes": {
 
  }
}
EOF

清单 2. 目录结构

1
2
3
4
5
6
7
8
9
10
11
..
environments/
    test.json
cookbooks/
    mariadb-galera-cluster/
        recipes/
            default.rb
        templates/
            default/
        attributes/
            default.rb

安装 Mariadb

利用在 Chef Server 机器上配置的 yum 源来安装 Mariadb,需要在目标机器的/etc/yum.repos.d 目录下加入相应的配置文件。将该配置文件的内容预先定义在 mariadb-galera-cluster/templates/default/chef_server.repo.erb 中,如清单 2 所示。同时,在 mariadb-galera-cluster/recipes/default.rb 中定义这一部分的安装流程,如清单 3 所示。配置好 yum 源后,即可通过 yum 命令安装预先下载好的 Mariadb 安装介质。

安装完成后,可以执行一些基本的数据库初始化任务,例如设置 root 用户的密码和权限,这些任务可以定义在一个 sql 文件中。另外也可以通过编辑/etc/my.cnf 对 Mariadb 进行一些基本的配置。全部完成后重启 Mariadb 的服务。

清单 3. templates/default/chef_server.repo.erb,定义 yum 配置

1
2
3
4
5
6
[chef_server_repo]
name=chef_server_repo
baseurl=http://chefserver:80/yum_repo
enabled=1
gpgcheck=0
sslverify=0

清单 4. recipes/default.rb,安装 Mariadb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template "/etc/yum.repos.d" do
        source "chef_server.repo.erb"
        owner 'root'
        mode 0755
        action :create
end
 
...
execute "Install Mariadb" do
        command "yum clean metadata && yum -y install mariadb-server"
end
...
bash "Config database settings..." do
        cwd "#{CWD}"
        user "root"
        group "root"
        code <<-EOF
       printf "\n[mysqld]\nlower_case_table_names=1" >> /etc/my.cnf
        systemctl enable mariadb.service
        systemctl start mariadb.service
        mysql < init.sql
        systemctl restart mariadb.service
        EOF
end

开启 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 的运行状态

利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb

小结

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

参考资源

相关推荐