├── Galera_on_CentOS
├── README.md
└── scripts
│ ├── README.md
│ ├── backup
│ ├── README.md
│ ├── conf.cfg
│ └── galera.bash
│ ├── galera-3-node.sh
│ └── var.cfg
├── Galera_on_Ubuntu
├── README.md
└── scripts
│ ├── README.md
│ ├── galera-u.bash
│ └── var.cfg
├── HA-cho-MariaDB-tren-CentOS7
├── README.md
├── db-cent7.bash
└── var.conf
├── README.md
├── db-cent7-2.bash
├── docs
├── 1-install-mysql-community-from-repository.md
├── 2-replica-master-slave.md
├── backup-mysql-to-minio-s3.md
└── gtid-notes.md
└── drafts
├── GALERA-setup-ubuntu.bash
├── Hadoop-v1.mmap
├── NNSv1.mmap
├── NNSv2.mmap
├── NNSv3.mmap
├── README-1.md
├── ghichepdb.md
└── setup-centos-full.bash
/Galera_on_CentOS/README.md:
--------------------------------------------------------------------------------
1 | ## Hướng dẫn cài đặt Galera cho MariaDB trên CentOS 7
2 |
3 | ### Menu
4 |
5 | [1. Chuẩn bị ](#1)
6 |
7 | - [1.1. Môi trường cài đặt](#1.1)
8 | - [1.2. Thiết lập IP cho các node](#1.2)
9 | - [1.3. Mô hình](#1.3)
10 |
11 | [2. Các bước tiến hành](#2)
12 |
13 | - [2.1 Cài đặt MariaDB trên các node](#2.1)
14 | - [2.2 Cài đặt Galera cho MariaDB](#2.2)
15 | - [2.3 Kiểm tra hoạt động](#2.3)
16 |
17 | [3. Tham khảo](#3)
18 |
19 | - [Script cài đặt tự động] (https://github.com/hoangdh/ghichep-database/tree/master/Galera_on_CentOS/scripts)
20 |
21 |
22 | ## 1. Chuẩn bị
23 |
24 |
25 | ### 1.1. Môi trường cài đặt
26 |
27 | ```
28 | [root@node1 ~]# cat /etc/redhat-release
29 | CentOS Linux release 7.2.1511 (Core)
30 | [root@node1 ~]# uname -a
31 | Linux node1.hoang.lab 3.10.0-327.28.3.el7.x86_64 #1 SMP Thu Aug 18 19:05:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
32 | ```
33 |
34 |
35 | ### 1.2. Thiết lập IP cho các node
36 |
37 | ```
38 | IP:
39 | Node 1: 192.168.100.196
40 | Node 2: 192.168.100.197
41 | Node 3: 192.168.100.198
42 |
43 | GATEWAY: 192.168.100.1
44 | NETWORK: 192.168.100.0/24
45 | ```
46 |
47 |
48 | ### 1.3. Mô hình
49 |
50 |
51 |
52 |
53 | ## 2. Các bước tiến hành
54 |
55 |
56 | ### 2.1. Cài đặt MariaDB trên các node
57 |
58 | #### Cài đặt Repo cho các node và set độ ưu tiên của repo
59 |
60 | ```
61 | yum -y install centos-release-scl-rh centos-release-scl
62 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo
63 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
64 | ```
65 |
66 | #### Cài đặt MariaDB
67 |
68 | - Cài đặt MariaDB với `yum`
69 |
70 | ```
71 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server
72 | ```
73 |
74 | - Load các biến môi trường
75 |
76 | ```
77 | scl enable rh-mariadb101 bash
78 | ```
79 |
80 | - Kiểm tra phiên bản của MariaDB
81 |
82 | ```
83 | mysql -V
84 | ```
85 |
86 |
87 |
88 | - Cho `rh-mariadb` khởi động cùng hệ thống, soạn file với nội dung:
89 |
90 | ```
91 | vi /etc/profile.d/rh-mariadb101.sh
92 | ```
93 |
94 | ```
95 | #!/bin/bash
96 |
97 | source /opt/rh/rh-mariadb101/enable
98 | export X_SCLS="`scl enable rh-mariadb101 'echo $X_SCLS'`"
99 | ```
100 |
101 | #### Bật MariaDB và cấu hình ban đầu:
102 |
103 | - Khai báo thêm bộ mã hóa ký tự UTF-8 vào file cấu hình
104 |
105 | ```
106 | vi /etc/opt/rh/rh-mariadb101/my.cnf.d/mariadb-server.cnf
107 | ```
108 |
109 | - Tìm section `[mysqld]` và thêm vào với nội dung
110 |
111 | ```
112 | ...
113 | character-set-server=utf8
114 | ...
115 | ```
116 |
117 | #### Khởi động và cấu hình
118 |
119 | - Bật `MariaDB` và cho khởi động cùng hệ thống:
120 |
121 | ```
122 | systemctl start rh-mariadb101-mariadb
123 | systemctl enable rh-mariadb101-mariadb
124 | ```
125 |
126 | - Cài đặt cơ bản
127 |
128 | ```
129 | mysql_secure_installation
130 | ```
131 |
132 |
133 |
134 | - Cài đặt tiếp theo
135 |
136 |
137 |
138 | - Kiểm tra Đăng nhập `MariaDB`
139 |
140 | ```
141 | mysql -uroot -p -e "show databases;"
142 | ```
143 |
144 |
145 |
146 |
147 | ### 2.2 Cài đặt Galera cho MariaDB
148 |
149 | #### Cài đặt `Galera` trên các node
150 |
151 | ```
152 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server-galera
153 | ```
154 |
155 | - Cấu hình tường lửa trên các node
156 |
157 | ```
158 | firewall-cmd --add-service=mysql --permanent
159 | firewall-cmd --add-port={3306/tcp,4567/tcp,4568/tcp,4444/tcp} --permanent
160 | firewall-cmd --reload
161 | ```
162 |
163 | - Cấu hình ở Node 1:
164 |
165 | ```
166 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org
167 | vi /etc/opt/rh/rh-mariadb101/my.cnf.d/mariadb-server.cnf
168 | ```
169 |
170 | - Mở file `mariadb-server.cnf`, tìm đến section `galera` và **chỉnh sửa những dòng** như sau:
171 |
172 | ```
173 | [galera]
174 | # Mandatory settings
175 | wsrep_on=ON
176 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so
177 | wsrep_cluster_address=gcomm://
178 |
179 | binlog_format=row
180 | default_storage_engine=InnoDB
181 | innodb_autoinc_lock_mode=2
182 | bind-address=0.0.0.0
183 |
184 | # Them moi 3 dong nay
185 | wsrep_cluster_name="MariaDB_Cluster"
186 | wsrep_node_address="192.168.100.196"
187 | wsrep_sst_method=rsync
188 | ```
189 |
190 |
191 |
192 | - Sau khi chỉnh sửa xong, khởi động `Galera`
193 |
194 | ```
195 | /opt/rh/rh-mariadb101/root/usr/bin/galera_new_cluster
196 | ```
197 |
198 | - Cấu hình ở các node còn lại:
199 |
200 | ```
201 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org
202 | vi /etc/opt/rh/rh-mariadb101/my.cnf.d/mariadb-server.cnf
203 | ```
204 |
205 | Mở file `mariadb-server.cnf`, tìm đến section `galera` và **chỉnh sửa những dòng** tương ứng:
206 |
207 | ```
208 | [galera]
209 | # Mandatory settings
210 | wsrep_on=ON
211 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so
212 | wsrep_cluster_address="gcomm://192.168.100.196,192.168.100.197,192.168.100.198"
213 |
214 | binlog_format=row
215 | default_storage_engine=InnoDB
216 | innodb_autoinc_lock_mode=2
217 | bind-address=0.0.0.0
218 |
219 | # Them moi nhung dong sau:
220 | wsrep_cluster_name="MariaDB_Cluster"
221 | wsrep_node_address="IP_Của_Node_Tương_Ứng"
222 | wsrep_sst_method=rsync
223 | ```
224 |
225 | #### Trên node 2:
226 |
227 |
228 |
229 | #### Trên node 3:
230 |
231 |
232 |
233 | - Khởi động lại `MariaDB` trên từng node:
234 |
235 | ```
236 | systemctl restart rh-mariadb101-mariadb
237 | ```
238 |
239 |
240 | #### 2.3 Kiểm tra hoạt động
241 |
242 | - Tạo một database ở node 1:
243 |
244 | ```
245 | mysql -uroot -p -e "create database node1;"
246 | mysql -uroot -p -e "show databases;"
247 | ```
248 |
249 |
250 |
251 | - Xem và tạo database ở node 2:
252 |
253 | ```
254 | mysql -uroot -p
255 |
256 | show databases;
257 | create database node2;
258 | ```
259 |
260 |
261 |
262 | - Xem và tạo database ở node 3:
263 |
264 | ```
265 | mysql -uroot -p
266 |
267 | show databases;
268 | create database node3;
269 | ```
270 |
271 |
272 |
273 | - Quay lại node 1, chúng ta kiểm tra lại sẽ có 3 database được tạo:
274 |
275 | ```
276 | mysql -uroot -p -e "show databases;"
277 | ```
278 |
279 |
280 |
281 |
282 | ## 3. Tham khảo:
283 |
284 | - https://www.server-world.info/en/note?os=CentOS_7&p=mariadb101&f=4
--------------------------------------------------------------------------------
/Galera_on_CentOS/scripts/README.md:
--------------------------------------------------------------------------------
1 | ## Hướng dẫn sử dụng
2 |
3 | ### Yêu cầu và chuẩn bị:
4 |
5 | - Tải 2 file `galera-3-node.sh` và `var.cfg` về một máy bất kỳ và có thể kết nối tới 3 node muốn cài đặt Cluster
6 | - Đảm bảo giữa 3 node phải kết nối được với nhau
7 | - Trên 3 node muốn cài Galera, phải đặt IP tĩnh
8 | - Khai báo lần lượt địa chỉ IP của các máy chủ vào file `var.cfg`
9 | - Khai báo hostname của từng hostname của các máy chủ
10 | - Khai báo password cho user root của MariaDB (User này có quyền truy cập trên tất cả các host)
11 |
12 | ### Các bước thực hiện:
13 |
14 | - Tải script và file chứa các biến về máy:
15 |
16 | ```
17 | wget
18 | wget
19 | ```
20 |
21 | - Chỉnh sửa file `var.cfg` phù hợp với các thông số của bạn
22 |
23 | - `IP1` - `IP3`: Địa chỉ IP của các node mà bạn muốn cài đặt
24 | - `HOST1` - `HOST3`: Tên hostname của các node cài đặt (Tùy chọn)
25 | - `PASSWORD`: Mật khẩu của user `root` trong MariaDB.
26 |
27 | - Phân quyền
28 |
29 | ```
30 | chown +x
31 | ```
32 |
33 | - Tiến hành cài đặt - Chạy Script
34 |
35 | ```
36 | ./
37 | ```
38 |
39 | http://linoxide.com/cluster/mariadb-centos-7-galera-cluster-haproxy/
40 | - chckconfig
41 | - tat selinux
42 |
43 | Sử dụng Script như sau:
44 |
45 | - Sửa file cấu hình `var.cfg` (Địa chỉ IP, HOSTNAME, password cho user root của MySQL)
46 | - Tạo key SSH (Yêu cầu phải nhập password `root` từng host)
47 | - Tự động cài đặt Galera
48 |
49 | *Chúc các bạn thành công!*
--------------------------------------------------------------------------------
/Galera_on_CentOS/scripts/backup/README.md:
--------------------------------------------------------------------------------
1 | ## Hướng dẫn sử dụng
2 |
3 | [1. Giới thiệu ](#1)
4 |
5 | [2. Yêu cầu](#2)
6 |
7 | [3. Các bước thực hiện](#3)
8 |
9 |
10 | ### 1. Giới thiệu
11 |
12 | Script này sẽ giúp các bạn cài đặt và cấu hình tự động Galera 3 node cho MariaDB trên CentOS 7. Các bạn có thể xem bài hướng dẫn cài đặt bằng tay ở đây để hiểu rõ hơn quá trình làm việc của script.
13 |
14 |
15 | ### 2. Yêu cầu:
16 |
17 | - Trên các node phải triển khai SSH-Key (Không có passphare)
18 | - Các SSH-Key phải được đặt tên theo node. Key của node thứ nhất có tên là `node1`, key của node thứ hai có tên là `node2` và key của node thứ 3 là `node3`.
19 | - Các file cấu hình `conf.cfg`, script `galera.bash` và SSH-Key của các node phải nằm trong cùng một thư mục.
20 | - Khi cài đặt và cấu hình, script sẽ không đặt mật khẩu tài khoản `root` trên bất cứ host nào, mặc định password trống. Vì vậy hãy thay đổi nó ngay sau khi quá trình cài đặt thành công.
21 |
22 | *Script có thể chạy trên một máy bất kỳ hoặc trên 1 trong 3 node đáp ứng đủ các yêu cầu trên..*
23 |
24 |
25 | ### 3. Các bước thực hiện
26 |
27 | - **Bước 1**: Khai báo thông tin các node của bạn vào file `conf.cfg` theo mẫu:
28 |
29 | ```
30 | export IP1=192.168.100.196
31 | export IP2=192.168.100.197
32 | export IP3=192.168.100.198
33 | ```
34 |
35 | **Chú thích**:
36 | - `IP1` là địa chỉ IP của node 1
37 | - `IP2` là địa chỉ IP của node 2
38 | - `IP3` là địa chỉ IP của node 3
39 |
40 | - **Bước 2**: Kiểm tra lại các file cấu hình `var.cfg`, script `galera.bash` và SSH-Key của các node trong thư mục
41 |
42 | - **Bước 3**: Phân quyền chạy cho script
43 |
44 | ```
45 | chmod 755 galera.bash
46 | ```
47 | - **Bước 4**: Chạy script
48 |
49 | ```
50 | ./galera.bash
51 | ```
52 |
53 | *Chúc các bạn thành công!*
--------------------------------------------------------------------------------
/Galera_on_CentOS/scripts/backup/conf.cfg:
--------------------------------------------------------------------------------
1 | export IP1=192.168.100.196
2 | export IP2=192.168.100.197
3 | export IP3=192.168.100.198
4 |
--------------------------------------------------------------------------------
/Galera_on_CentOS/scripts/backup/galera.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | source conf.cfg
3 |
4 | ham()
5 | {
6 | cat > mariadb.repo << H2
7 | [mariadb]
8 | name = MariaDB
9 | baseurl = http://yum.mariadb.org/10.0/rhel7-amd64/
10 | gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
11 | gpgcheck=1
12 | H2
13 |
14 | scp -i node$1 mariadb.repo root@$2:/etc/yum.repos.d/
15 | ssh -i node$1 root@$2 "setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config"
16 | ssh -i node$1 root@$2 "yum install MariaDB-Galera-server MariaDB-client galera -y"
17 | cat > galera.cnf << H2
18 | [galera]
19 | # Mandatory settings
20 | wsrep_provider=/usr/lib64/galera/libgalera_smm.so
21 | wsrep_cluster_address='gcomm://$IP1,$IP2,$IP3'
22 | wsrep_cluster_name='mariadb_cluster'
23 | wsrep_node_address='$2'
24 | wsrep_sst_method=rsync
25 | binlog_format=row
26 | default_storage_engine=InnoDB
27 | innodb_autoinc_lock_mode=2
28 | bind-address=0.0.0.0
29 | H2
30 | scp -i node$1 galera.cnf root@$2:/etc/my.cnf.d/
31 | if [ "$1" = "1" ]
32 | then
33 | ssh -i node$1 root@$2 "/etc/init.d/mysql restart --wsrep-new-cluster"
34 | else
35 | ssh -i node$1 root@$2 "/etc/init.d/mysql restart"
36 | fi
37 |
38 | }
39 | #
40 | for x in $IP1 $IP2 $IP3
41 | do
42 | list=`cat conf.cfg`
43 | for i in $list
44 | do
45 | y=`echo $i | grep -w "$x"`
46 | if [ -n "$y" ]
47 | then
48 | NODE=`echo $y | awk -F = '{print $1}' | awk -F P {'print $2'}`
49 | ham $NODE $x
50 | fi
51 | done
52 | done
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/Galera_on_CentOS/scripts/galera-3-node.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set_host()
4 | {
5 | . ./var.cfg
6 | ### Write to hosts
7 | echo -e "$IP1 $HOST1
8 | $IP2 $HOST2
9 | $IP3 $HOST3" >> /etc/hosts
10 | ### Gen-key
11 | ssh-keygen -t rsa -N "" -f ~/.ssh/hoangdh.key
12 | mv ~/.ssh/hoangdh.key.pub ~/.ssh/authorized_keys
13 | mv ~/.ssh/hoangdh.key ~/.ssh/id_rsa
14 | chmod 600 ~/.ssh/authorized_keys
15 |
16 | for ip in $IP1 $IP2 $IP3
17 | do
18 | NODE=`cat var.cfg | grep -w "$ip" | awk -F = '{print $1}' | awk -F P {'print $2'}`
19 | HOST=`cat var.cfg | grep -e "HOST$NODE" | awk -F = '{print $2}'`
20 | scp -r ~/.ssh/ $HOST:~/
21 | # hostnamectl set-hostname $HOST -H root@$HOST
22 | ssh $HOST "hostnamectl set-hostname $HOST"
23 | echo "Set hostname for host $ip: $NODE - $HOST"
24 | scp /etc/hosts root@$HOST:/etc/
25 | done
26 | }
27 |
28 | setup ()
29 | {
30 | cat > mariadb.repo << H2
31 | [mariadb]
32 | name = MariaDB
33 | baseurl = http://yum.mariadb.org/10.0/rhel7-amd64/
34 | gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
35 | gpgcheck=1
36 | H2
37 |
38 | scp mariadb.repo root@$1:/etc/yum.repos.d/
39 | ssh root@$1 "setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config"
40 | ssh root@$1 "yum install MariaDB-Galera-server MariaDB-client galera -y"
41 | cat > galera.cnf << H2
42 | [galera]
43 | # Mandatory settings
44 | wsrep_provider=/usr/lib64/galera/libgalera_smm.so
45 | wsrep_cluster_address='gcomm://$IP1,$IP2,$IP3'
46 | wsrep_cluster_name='mariadb_cluster'
47 | wsrep_node_address='$1'
48 | wsrep_sst_method=rsync
49 | binlog_format=row
50 | default_storage_engine=InnoDB
51 | innodb_autoinc_lock_mode=2
52 | bind-address=0.0.0.0
53 | H2
54 | scp galera.cnf root@$1:/etc/my.cnf.d/
55 | if [ "$2" = "1" ]
56 | then
57 |
58 | ssh root@$1 "/etc/init.d/mysql restart --wsrep-new-cluster"
59 | ssh root@$1 "mysql -uroot -e \"set password for 'root'@'localhost' = password('$PASSWORD');\""
60 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"DELETE from mysql.user where Password = '';\""
61 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"CREATE USER 'root'@'%' IDENTIFIED BY '$PASSWORD';\""
62 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';\""
63 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"FLUSH PRIVILEGES;\""
64 |
65 | elif [ "$2" = "2" ]
66 | then
67 | ssh root@$1 "/etc/init.d/mysql restart"
68 | ssh root@$1 "mysql -uroot -e \"set password for 'root'@'localhost' = password('$PASSWORD');\""
69 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"DELETE from mysql.user where Password = '';\""
70 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"drop database test;\""
71 | else
72 | ssh root@$1 "/etc/init.d/mysql restart"
73 | fi
74 | }
75 |
76 | set_host
77 | for x in $IP1 $IP2 $IP3
78 | do
79 | list=`cat var.cfg`
80 | for i in $list
81 | do
82 | y=`echo $i | grep -w "$x"`
83 | if [ -n "$y" ]
84 | then
85 | NODE=`echo $y | awk -F = '{print $1}' | awk -F P {'print $2'}`
86 | setup $x $NODE
87 | ssh root@$x "chkconfig mysql on"
88 | fi
89 | done
90 | done
--------------------------------------------------------------------------------
/Galera_on_CentOS/scripts/var.cfg:
--------------------------------------------------------------------------------
1 | export IP1=192.168.100.139
2 | export IP2=192.168.100.140
3 | export IP3=192.168.100.142
4 | export HOST1=mysql01
5 | export HOST2=mysql02
6 | export HOST3=mysql03
7 | export PASSWORD=abc@123
--------------------------------------------------------------------------------
/Galera_on_Ubuntu/README.md:
--------------------------------------------------------------------------------
1 | # Ghi chép cài đặt Galera Cluster
2 |
3 | ### Menu
4 |
5 | [1. Giới thiệu về Galera](#1)
6 |
7 | [2. Chuẩn bị ](#2)
8 |
9 | - [2.1 Chuẩn bị](#2.1)
10 | - [2.2 Thiết lập IP cho các node](#2.2)
11 | - [2.3 Mô hình](#2.3)
12 |
13 | [3. Các bước tiến hành](#3)
14 |
15 | - [Bước 1. Thêm repo cho các máy chủ](#3.1)
16 | - [Bước 2. Cài đặt MySQL và Galera trên các máy chủ](#3.2)
17 | - [Bước 3. Cấu hình ở máy chủ thứ nhất](#3.3)
18 | - [Bước 4. Cấu hình trên các node còn lại](#3.4)
19 | - [Bước 5. Cấu hình Firewall trên các máy chủ](#3.5)
20 | - [Bước 6. Khởi động Cluster](#3.6)
21 | - [Bước 7. Cấu hình Debian Maintenance User](#3.7)
22 | - [Bước 8. Kiểm tra hoạt động](#3.8)
23 |
24 | [4. Kết luận](#4)
25 |
26 |
27 | ## 1. Giới thiệu Galera
28 |
29 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng.
30 |
31 |
32 |
33 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**:
34 |
35 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive.
36 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node
37 |
38 | Bài hướng dẫn dưới đây tôi sẽ cấu hình cho nó hoạt động ở mode **Active - Active**.
39 |
40 |
41 | ## 2. Chuẩn bị
42 |
43 |
44 | ### 2.1. Môi trường cài đặt
45 |
46 | ```
47 | root@node3:~# lsb_release -a
48 | No LSB modules are available.
49 | Distributor ID: Ubuntu
50 | Description: Ubuntu 16.04.1 LTS
51 | Release: 16.04
52 | Codename: xenial
53 | root@node3:~# uname -a
54 | Linux node3.hoang.lab 4.4.0-36-generic #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
55 | ```
56 |
57 |
58 | ### 2.2. Thiết lập IP cho các node
59 |
60 | ```
61 | IP:
62 | Node 1: 192.168.100.192
63 | Node 2: 192.168.100.193
64 | Node 3: 192.168.100.194
65 |
66 | GATEWAY: 192.168.100.1
67 | ```
68 |
69 |
70 | ### 2.3. Mô hình
71 |
72 |
73 |
74 |
75 | ## 3. Các bước tiến hành
76 |
77 |
78 | ### Bước 1: Thêm repo cho các máy chủ
79 |
80 | ```
81 | apt-key adv --keyserver keyserver.ubuntu.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA
82 | add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main'
83 | apt-get update
84 | ```
85 |
86 |
87 | ### Bước 2: Cài đặt MySQL và Galera trên các máy chủ
88 |
89 | ```
90 | apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6
91 | apt-get install rsync
92 | ```
93 |
94 | Trong khi cài đặt mysql có yêu cầu nhập password cho `root` - quản lý MySQL
95 |
96 |
97 |
98 | **Note:** `rsync` là thành phần thiết yếu của Galera.
99 |
100 |
101 | ### Bước 3: Cấu hình ở máy chủ thứ nhất
102 |
103 | Tạo một file có tên `galera.cnf` trong thư mục `/etc/mysql/conf.d` với nội dung
104 |
105 | ```
106 | vi /etc/mysql/conf.d/galera.cnf
107 | ```
108 |
109 | ```
110 | [mysqld]
111 | query_cache_size=0
112 | binlog_format=ROW
113 | default-storage-engine=innodb
114 | innodb_autoinc_lock_mode=2
115 | query_cache_type=0
116 | bind-address=0.0.0.0
117 |
118 | # Galera Provider Configuration
119 | wsrep_on=ON
120 | wsrep_provider=/usr/lib/galera/libgalera_smm.so
121 |
122 | # Galera Cluster Configuration
123 | wsrep_cluster_name="test_cluster"
124 | wsrep_cluster_address="gcomm://first_ip,second_ip,third_ip"
125 |
126 | # Galera Synchronization Configuration
127 | wsrep_sst_method=rsync
128 |
129 | # Galera Node Configuration
130 | wsrep_node_address="this_node_ip"
131 | wsrep_node_name="this_node_name"
132 | ```
133 |
134 | Note:
135 |
136 | - Điền địa chỉ IP của các máy chủ thay thế `first_ip,second_ip,third_ip`
137 | - Điền địa chỉ IP của node đang cấu hình vào trường `this_node_ip`
138 | - Điền tên của node vào `this_node_name` (Tên tùy chọn, phục vụ cho việc Debug)
139 |
140 |
141 |
142 | **Tiếp theo**, vào file `my.cnf` và comment out lại dòng `bind-address`
143 |
144 | ```
145 | vi /etc/mysql/my.cnf
146 | ```
147 |
148 |
149 |
150 |
151 | ### Bước 4: Cấu hình trên các node còn lại
152 |
153 | Ở các node còn lại, chúng ta copy file `galera.cnf` ở node thứ nhất vào thư mục `/etc/mysql/conf.d/` của 2 node còn lại. Chỉnh sửa nội dung cho phù hợp với node. Cụ thể
154 |
155 | ```
156 | . . .
157 | # Galera Node Configuration
158 | wsrep_node_address="this_node_ip"
159 | wsrep_node_name="this_node_name"
160 | . . .
161 | ```
162 |
163 | Thay thế `this_node_ip` và `this_node_name` ở file `galera.cnf`
164 |
165 | Trên node 2:
166 |
167 |
168 |
169 | Trên node 3:
170 |
171 |
172 |
173 | Cũng như ở node 1, trên các node còn lại, chúng ta vào `my.cnf` và comment out dòng `bind-address`
174 |
175 | ```
176 | vi /etc/mysql/my.cnf
177 | ```
178 |
179 | Trên node 2:
180 |
181 |
182 |
183 | Trên node 3:
184 |
185 |
186 |
187 |
188 | ### Bước 5: Cấu hình Firewall trên các máy chủ
189 |
190 | `Galera` sử dụng 4 port để làm việc
191 |
192 | - `3306`: Cho phép các MySQL-Client kết nối đến server
193 | - `4567`: Cho phép các máy chủ có replication các trafic với nhau và hoạt động ở cả UDP và TCP
194 | - `4568`: For Incremental State Transfer.
195 | - `4444`: For all other State Snapshot Transfer.
196 |
197 | ```
198 | ufw enable
199 | ufw allow 22,3306,4567,4568,4444/tcp
200 | ufw allow 4567/udp
201 | ```
202 |
203 |
204 |
205 | Khi bật Firewall, hệ thống sẽ hỏi có giữ lại phiên SSH hiện tại. Chúng ta chọn `Y` và tiếp tục cấu hình các bước tiếp theo. Câu lệnh `ufw status` có trong hình để xem lại trạng thái của Firewall.
206 |
207 |
208 | ### Bước 6: Khởi động Cluster
209 |
210 | #### Stop dịch vụ mysql trên tất cả các node
211 |
212 | ```
213 | systemctl stop mysql
214 | ```
215 |
216 | #### Chạy dịch vụ ở node 1
217 |
218 | ```
219 | /etc/init.d/mysql start --wsrep-new-cluster
220 | ```
221 |
222 | Kiểm tra bằng câu lệnh
223 |
224 | ```
225 | mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
226 | ```
227 |
228 | Kết quả hiện ra
229 |
230 | ```
231 | +--------------------+-------+
232 | | Variable_name | Value |
233 | +--------------------+-------+
234 | | wsrep_cluster_size | 1 |
235 | +--------------------+-------+
236 | ```
237 |
238 |
239 |
240 | #### Chạy dịch vụ ở node 2
241 |
242 | ```
243 | systemctl start mysql
244 | ```
245 |
246 | Kiểm tra bằng câu lệnh
247 |
248 | ```
249 | mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
250 | ```
251 |
252 | Kết quả hiện ra
253 |
254 | ```
255 | +--------------------+-------+
256 | | Variable_name | Value |
257 | +--------------------+-------+
258 | | wsrep_cluster_size | 2 |
259 | +--------------------+-------+
260 | ```
261 |
262 |
263 |
264 | #### Chạy dịch vụ ở node 3
265 |
266 | ```
267 | systemctl start mysql
268 | ```
269 |
270 | Kiểm tra bằng câu lệnh
271 |
272 | ```
273 | mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
274 | ```
275 |
276 | Kết quả hiện ra
277 |
278 | ```
279 | +--------------------+-------+
280 | | Variable_name | Value |
281 | +--------------------+-------+
282 | | wsrep_cluster_size | 3 |
283 | +--------------------+-------+
284 | ```
285 |
286 |
287 |
288 |
289 | ### Bước 7: Cấu hình Debian Maintenance User
290 |
291 | Hiện tại, trên Ubuntu và Các máy chủ mysql của Debian sẽ có một user đặc biệt để thực hiện các quá trình trong Galera. Mặc định, khi cài đặt sẽ có một user được tạo ra và được ghi ở `/etc/mysql/debian.cnf` trên mỗi server.
292 |
293 | #### Copy file từ máy chủ thứ nhất (node 1) ra các máy chủ còn lại
294 |
295 | Bước này khá đơn giản, chúng ta copy file `debian.cnf` từ server thứ nhất sang các server khác
296 |
297 | Nội dung của file:
298 |
299 | ```
300 | [client]
301 | host = localhost
302 | user = debian-sys-maint
303 | password = 03P8rdlknkXr1upf
304 | socket = /var/run/mysqld/mysqld.sock
305 | [mysql_upgrade]
306 | host = localhost
307 | user = debian-sys-maint
308 | password = 03P8rdlknkXr1upf
309 | socket = /var/run/mysqld/mysqld.sock
310 | basedir = /usr
311 | ```
312 |
313 | Thử đăng nhập vào mysql:
314 |
315 | ```
316 | mysql -u debian-sys-maint -p
317 | ```
318 |
319 |
320 |
321 | Nếu không được, hãy đăng nhập vào bằng `root` và chỉnh sửa lại password cho nó.
322 |
323 | ```
324 | update mysql.user set password=PASSWORD('password_from_debian.cnf') where User='debian-sys-maint';
325 | ```
326 |
327 | **Note:** Thay thế `password_from_debian.cnf` bằng chuỗi trong password trong file `debian.cnf`
328 |
329 |
330 | ### Bước 8: Test
331 |
332 | #### Ghi dữ liệu vào Node 1
333 |
334 | ```
335 | mysql -u root -p -e 'CREATE DATABASE playground;
336 | CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
337 | INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'
338 | ```
339 |
340 |
341 |
342 | #### Đọc và ghi dữ liệu vào Node 2
343 |
344 | ```
345 | mysql -u root -p -e 'SELECT * FROM playground.equipment;'
346 | ```
347 |
348 | Kết quả:
349 |
350 |
351 |
352 | Ghi dữ liệu:
353 |
354 | ```
355 | mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
356 | ```
357 |
358 |
359 |
360 | #### Đọc và ghi dữ liệu trên Node 3
361 |
362 | ```
363 | mysql -u root -p -e 'SELECT * FROM playground.equipment;'
364 | ```
365 |
366 | Kết quả:
367 |
368 |
369 |
370 | Ghi dữ liệu
371 |
372 | ```
373 | mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
374 | ```
375 |
376 |
377 |
378 | #### Đọc dữ liệu trên Node 1
379 |
380 | ```
381 | mysql -u root -p -e 'SELECT * FROM playground.equipment;'
382 | ```
383 |
384 | Kết quả:
385 |
386 |
387 |
388 |
389 | ## 4. Kết luận
390 |
391 | Trên đây là hướng dẫn cấu hình Galera với mô hình hoạt động là **Active - Active** trên hệ điều hành Ubuntu 16. Hy vọng có thể giúp ích cho hệ thống của các bạn. Chúc các bạn thành công!
--------------------------------------------------------------------------------
/Galera_on_Ubuntu/scripts/README.md:
--------------------------------------------------------------------------------
1 | ## Hướng dẫn sử dụng
2 |
3 | [1. Giới thiệu ](#1)
4 |
5 | [2. Yêu cầu](#2)
6 |
7 | [3. Các bước thực hiện](#3)
8 |
9 |
10 | ### 1. Giới thiệu
11 |
12 | Script này sẽ giúp các bạn cài đặt và cấu hình tự động Galera 3 node cho MySQL trên Ubuntu. Các bạn có thể xem bài hướng dẫn cài đặt bằng tay ở đây để hiểu rõ hơn quá trình làm việc của script.
13 |
14 |
15 | ### 2. Yêu cầu:
16 |
17 | - Trên các node phải triển khai SSH-Key (Không có passphare)
18 | - Các SSH-Key phải được đặt tên theo node. Key của node thứ nhất có tên là `node1`, key của node thứ hai có tên là `node2` và key của node thứ 3 là `node3`.
19 | - Các file cấu hình `conf.cfg`, script `galera.bash` và SSH-Key của các node phải nằm trong cùng một thư mục.
20 | - Khi cài đặt và cấu hình, script sẽ không đặt mật khẩu tài khoản `root` trên bất cứ host nào, mặc định password trống. Vì vậy hãy thay đổi nó ngay sau khi quá trình cài đặt thành công.
21 |
22 | *Script có thể chạy trên một máy bất kỳ hoặc trên 1 trong 3 node đáp ứng đủ các yêu cầu trên..*
23 |
24 |
25 | ### 3. Các bước thực hiện
26 |
27 | - **Bước 1**: Khai báo thông tin các node của bạn vào file `conf.cfg` theo mẫu:
28 |
29 | ```
30 | export IP1=192.168.100.196
31 | export IP2=192.168.100.197
32 | export IP3=192.168.100.198
33 | ```
34 |
35 | **Chú thích**:
36 | - `IP1` là địa chỉ IP của node 1
37 | - `IP2` là địa chỉ IP của node 2
38 | - `IP3` là địa chỉ IP của node 3
39 |
40 | - **Bước 2**: Kiểm tra lại các file cấu hình `var.cfg`, script `galera.bash` và SSH-Key của các node trong thư mục
41 |
42 | - **Bước 3**: Phân quyền chạy cho script
43 |
44 | ```
45 | chmod 755 galera-u.bash
46 | ```
47 | - **Bước 4**: Chạy script
48 |
49 | ```
50 | ./galera-u.bash
51 | ```
52 |
53 | *Chúc các bạn thành công!*
--------------------------------------------------------------------------------
/Galera_on_Ubuntu/scripts/galera-u.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | cauhinhchung()
4 | {
5 | ssh -i node$1 root@$2 "apt-key adv --keyserver keyserver.ubuntu.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA"
6 | ## Thay vao dong 5 U16: wget -qO - http://releases.galeracluster.com/GPG-KEY-galeracluster.com | sudo apt-key add -
7 | ssh -i node$1 root@$2 "add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main'"
8 | ssh -i node$1 root@$2 "debconf-set-selections <<< \"mysql-server mysql-server/root_password password $PASSWORD\""
9 | ssh -i node$1 root@$2 "debconf-set-selections <<< \"mysql-server mysql-server/root_password_again password $PASSWORD\""
10 | ssh -i node$1 root@$2 "apt-get update"
11 | ssh -i node$1 root@$2 "apt-get install -y galera-3 galera-arbitrator-3 mysql-wsrep-5.6 rsync"
12 |
13 | cat > galera.cnf << H2
14 | [mysqld]
15 | binlog_format=ROW
16 | default-storage-engine=innodb
17 | innodb_autoinc_lock_mode=2
18 | bind-address=0.0.0.0
19 |
20 | # Galera Provider Configuration
21 | wsrep_on=ON
22 | wsrep_provider=/usr/lib/galera/libgalera_smm.so
23 |
24 | # Galera Cluster Configuration
25 | wsrep_cluster_name="test_cluster"
26 | wsrep_cluster_address="gcomm://$IP1,$IP2,$IP3"
27 |
28 | # Galera Synchronization Configuration
29 | wsrep_sst_method=rsync
30 |
31 | # Galera Node Configuration
32 | wsrep_node_address="$2"
33 | wsrep_node_name="Galera_Node_$1"
34 | H2
35 | scp -i node$1 galera.cnf root@$2:/etc/mysql/conf.d/
36 | ssh -i node$1 root@$2 "sed -i '/bind-address/ s/^#*/#/g' /etc/mysql/my.cnf"
37 | ssh -i node$1 root@$2 "ufw allow 3306,4567,4568,4444/tcp && ufw allow 4567/udp && /etc/init.d/mysql stop"
38 |
39 | # ssh -i node$1 root@$2
40 | # ssh -i node$1 root@$2
41 | }
42 |
43 | khoidongnode1()
44 | {
45 | scp -i node$1 root@$2:/etc/mysql/debian.cnf .
46 | ssh -i node$1 root@$2 "/etc/init.d/mysql start --wsrep-new-cluster"
47 | }
48 |
49 | khoidongnodekhac()
50 | {
51 | scp -i node$1 debian.cnf root@$2:/etc/mysql/
52 | ssh -i node$1 root@$2 "/etc/init.d/mysql start"
53 | if [ "$1" = "3" ]
54 | then
55 | ssh -i node$1 root@$2 "mysql -uroot -p$PASSWORD -e \"SHOW STATUS LIKE 'wsrep_cluster_size'\""
56 | fi
57 | }
58 |
59 | . var.cfg
60 | for ip in $IP1 $IP2 $IP3
61 | do
62 | NODE=`cat var.cfg | grep -w "$ip" | awk -F = '{print $1}' | awk -F P {'print $2'}`
63 | if [ "$NODE" = "1" ]
64 | then
65 | echo "Cai dat Node $NODE"
66 | cauhinhchung $NODE $ip
67 | khoidongnode1 $NODE $ip
68 | else
69 | echo "Cai dat Node $NODE"
70 | cauhinhchung $NODE $ip
71 | khoidongnodekhac $NODE $ip
72 | fi
73 | done
--------------------------------------------------------------------------------
/Galera_on_Ubuntu/scripts/var.cfg:
--------------------------------------------------------------------------------
1 | export PASSWORD=abc@123
2 | export IP1=192.168.100.192
3 | export IP2=192.168.100.193
4 | export IP3=192.168.100.194
5 |
--------------------------------------------------------------------------------
/HA-cho-MariaDB-tren-CentOS7/README.md:
--------------------------------------------------------------------------------
1 | ## Hướng dẫn cấu hình HA cho MariaDB sử dụng Pacemaker+Corosync và DRBD trên CentOS 7
2 |
3 | *Chúng ta sẽ sử dụng 2 node Active/Passive cho MariaDB HA cluster sử dụng Pacemaker+Corosync*
4 |
5 | [1. Chuẩn bị ](#1)
6 |
7 | - [1.1. Môi trường cài đặt](#1.1)
8 | - [1.2. Thiết lập IP cho các node](#1.2)
9 | - [1.3. Mô hình](#1.3)
10 |
11 | [2. Các bước tiến hành](#2)
12 |
13 | - [2.1 Thêm thông tin các node vào file hosts](#2.1)
14 | - [2.2 Cài đặt Pacemaker và Corosync](#2.2)
15 | - [2.3 Cấu hình Corosync](#2.3)
16 | - [2.4 Cài đặt DRBD và MariaDB](#2.4)
17 | - [2.4.1 DRBD ](#2.4.1)
18 | - [2.4.2 Tạo LVM Volume cho DRBD ](#2.4.2)
19 | - [2.4.3 Cấu hình DRBD ](#2.4.3)
20 | - [2.4.4 MariaDB ](#2.4.4)
21 | - [2.5 Cấu hình pacemaker ](#2.5)
22 |
23 | [3. Tham khảo](#3)
24 |
25 |
26 | ## 1. Chuẩn bị
27 |
28 |
29 | ### 1.1. Môi trường cài đặt
30 |
31 | ```
32 | [root@pcmk01 ~]# cat /etc/redhat-release
33 | CentOS Linux release 7.2.1511 (Core)
34 | [root@pcmk01 ~]# uname -a
35 | Linux pcmk01.hoang.lab 3.10.0-327.28.3.el7.x86_64 #1 SMP Tue Oct 11 8:35:45 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
36 | ```
37 |
38 | Chuẩn bị một Volume Group để lưu trữ các file đồng bộ từ drbd. (Dung lượng tùy theo kích cỡ DB của bạn, trong bài hướng dẫn tôi có một Volume Group có dung lượng trống lớn hơn 1GB. Nếu chưa rõ về khái niệm này, vui lòng đọc hướng dẫn tại đây .)
39 |
40 |
41 | ### 1.2. Thiết lập IP và hostname cho các node
42 |
43 | ```
44 | VIP: 192.168.100.123
45 | ```
46 |
47 | ```
48 | IP:
49 | Node 1: 192.168.100.196 - Hostname: pcmk01.hoang.lab
50 | Node 2: 192.168.100.197 - Hostname: pcmk02.hoang.lab
51 |
52 | GATEWAY: 192.168.100.1
53 | NETWORK: 192.168.100.0/24
54 | ```
55 |
56 |
57 | ### 1.3. Mô hình
58 |
59 |
60 |
61 |
62 | ## 2. Các bước thực hiện
63 |
64 |
65 | ### 2.1. Thêm thông tin các node vào file `hosts` của 2 node
66 |
67 | ```
68 | vi /etc/hosts
69 | ```
70 |
71 | ```
72 | ...
73 | 192.168.100.196 pcmk01 pcmk01-cr pcmk01-drbd
74 | 192.168.100.197 pcmk02 pcmk02-cr pcmk02-drbd
75 | ```
76 |
77 | Đặt hostname cho 2 node
78 |
79 | Trên node 1:
80 |
81 | ```
82 | hostnamectl set-hostname pcmk01
83 | ```
84 |
85 | Trên node 2:
86 |
87 | ```
88 | hostnamectl set-hostname pcmk02
89 | ```
90 |
91 | Tắt IPv6 trên cả 2 node
92 |
93 | ```
94 | vi /etc/sysctl.conf
95 | ```
96 |
97 | ```
98 | net.ipv6.conf.all.disable_ipv6 = 1
99 | net.ipv6.conf.default.disable_ipv6 = 1
100 | ```
101 |
102 | Xem lại cấu hình:
103 |
104 | ```
105 | sysctl -p
106 | ```
107 |
108 | Cấu hình SELinux ở chế độ enforcing.
109 |
110 |
111 | ### 2.2 Cài đặt Pacemaker và Corosync
112 |
113 | Chạy các lệnh sau trên cả 2 node:
114 |
115 | - Cài đặt pcs
116 |
117 | ```
118 | yum install -y pcs
119 | ```
120 |
121 | PSC sẽ cài đặt tất cả những gì liên quan tới Pacemaker và Corosync
122 |
123 | - Cài gói quản lý SELinux:
124 |
125 | ```
126 | yum install -y policycoreutils-python
127 | ```
128 |
129 | - Đặt password cho user của pcs có tên là `hacluster`
130 |
131 | ```
132 | echo "passwd" | passwd hacluster --stdin
133 | ```
134 |
135 | **Chú ý**: Thay `'passwd'` bằng mật khẩu của bạn.
136 |
137 | Khởi động dịch vụ pcs:
138 |
139 | ```
140 | systemctl start pcsd.service
141 | systemctl enable pcsd.service
142 | ```
143 |
144 |
145 | ### 2.3 Cấu hình Corosync
146 |
147 | Bước thực hiện trên node 1
148 |
149 | - Xác thực 2 node với nhau thông qua user `hacluster`. Token của quá trình được lưu trữ tại `/var/lib/pcsd/tokens`
150 |
151 | ```
152 | pcs cluster auth pcmk01-cr pcmk02-cr -u hacluster -p passwd
153 | ```
154 |
155 | - Tạo file cấu hình và đồng bộ chúng
156 |
157 | ```
158 | pcs cluster setup --name mysql_cluster pcmk01-cr pcmk02-cr
159 | ```
160 |
161 | - Khởi động cluster trên tất cả các node
162 |
163 | ```
164 | pcs cluster start --all
165 | ```
166 |
167 |
168 | ### 2.4 Cài đặt DRBD và MariaDB
169 |
170 |
171 |
172 | #### 2.4.1 DRBD
173 |
174 | Nôm na, DRBD đồng bộ dữ liệu 2 block devices thông qua mạng. Có thể nói đây là cơ chế RAID-1 của các thiết bị logic.
175 |
176 | - Chúng ta cài đặt DRBD trên cả 2 node:
177 |
178 | ```
179 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
180 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
181 | yum install -y kmod-drbd84 drbd84-utils
182 | ```
183 |
184 | - Cho phép các xử lý của DRBD qua SELinux
185 |
186 | ```
187 | semanage permissive -a drbd_t
188 | ```
189 |
190 |
191 |
192 | #### 2.4.2 Tạo LVM Volume cho DRBD
193 |
194 | Chúng ta tạo một logic volume trên cả 2 node, như đã nói ở trên thì tùy theo dung lượng DB của các bạn mà tạo dung lượng cho phù hợp. Bài hướng dẫn tôi sẽ demo dung lượng 1GB.
195 |
196 | Kiểm tra dung lượng Volume Group
197 |
198 | ```
199 | vgs
200 | VG #PV #LV #SN Attr VSize VFree
201 | vg_centos7 1 3 0 wz--n- 63.21g 45.97g
202 | ```
203 |
204 | Tạo mới một Logical Volume
205 |
206 | ```
207 | lvcreate --name lv_drbd --size 1024M vg_centos7
208 | ```
209 |
210 |
211 | #### 2.4.3 Cấu hình DRBD
212 |
213 | Cấu hình DRBD sử dụng mode `single-primary` với giao thức replication C
214 |
215 | - Tạo file cấu hình trên cả 2 node
216 |
217 | ```
218 | vi /etc/drbd.d/mysql01.res
219 | ```
220 |
221 | ```
222 | resource mysql01 {
223 | protocol C;
224 | meta-disk internal;
225 | device /dev/drbd0;
226 | disk /dev/vg_centos7/lv_drbd;
227 | handlers {
228 | split-brain "/usr/lib/drbd/notify-split-brain.sh root";
229 | }
230 | net {
231 | allow-two-primaries no;
232 | after-sb-0pri discard-zero-changes;
233 | after-sb-1pri discard-secondary;
234 | after-sb-2pri disconnect;
235 | rr-conflict disconnect;
236 | }
237 | disk {
238 | on-io-error detach;
239 | }
240 | syncer {
241 | verify-alg sha1;
242 | }
243 | on pcmk01 {
244 | address 192.168.100.196:7789;
245 | }
246 | on pcmk02 {
247 | address 192.168.100.197:7789;
248 | }
249 | }
250 | ```
251 |
252 | Ở đây, chúng ta sẽ có một resource có tên là `mysql01`, nó sử dụng `/dev/vg_centos7/lv_drbd` sử dụng như một lower-level device, được cấu hình với các meta-data.
253 |
254 | Nó sử dụng cổng TCP 7789 cho các kết nối mạng ở 2 địa chỉ IP của 2 node. Và hãy mở port này ở firewall.
255 |
256 | - Tạo tài nguyên DRBD
257 |
258 | ```
259 | drbdadm create-md mysql01
260 | ```
261 |
262 | - Kích hoạt tài nguyên
263 |
264 | ```
265 | drbdadm up mysql01
266 | ```
267 |
268 | - Sử dụng tài nguyên trên node 1 (Từ đây, chỉ chạy lệnh trên node1)
269 |
270 | ```
271 | drbdadm primary --force mysql01
272 | ```
273 |
274 | - Xem quá trình đồng bộ, xong sẽ chạy câu lệnh tiếp theo
275 |
276 | ```
277 | drbd-overview
278 |
279 | 0:mysql01/0 Connected Primary/Secondary UpToDate/UpToDate
280 |
281 | ```
282 |
283 | - Tạo filesystem cho DRBD với các tùy chọn sau:
284 |
285 | ```
286 | mkfs.ext4 -m 0 -L drbd /dev/drbd0
287 | tune2fs -c 30 -i 180d /dev/drbd0
288 | ```
289 |
290 | - Mount filesystem vừa tạo
291 |
292 | ```
293 | mount /dev/drbd0 /mnt
294 | ```
295 |
296 |
297 | #### 2.4.4 MariaDB
298 |
299 | Cài đặt MariaDB trên tất cả các node
300 |
301 | ```
302 | yum install -y mariadb-server mariadb
303 | ```
304 |
305 | Không cho khởi động cùng hệ thống, vì tí nữa chúng ta sẽ khai báo tài nguyên và quản lý bởi pacemaker
306 |
307 | ```
308 | systemctl disable mariadb.service
309 | ```
310 |
311 | ##### Thực hiện trên node 1
312 |
313 | Chúng ta khởi động MariaDB để cấu hình cơ bản
314 |
315 | ```
316 | systemctl start mariadb
317 | ```
318 |
319 | Khai báo trực tiếp với MariaDB qua câu lệnh
320 |
321 | ```
322 | mysql_install_db --datadir=/mnt --user=mysql
323 | ```
324 |
325 | Cấu hình cơ bản MariaDB
326 |
327 | ```
328 | mysql_secure_installation
329 | ```
330 |
331 | Khai báo policy vào SELinux về một số tùy chỉnh về thư mục lưu trữ dữ liệu của MariaDB, câu lệnh trên chúng ta đã thay đổi nó về `/mnt` . Mặc định các dữ liệu được lưu trữ tại `/var/lib/mysql`.
332 |
333 | ```
334 | semanage fcontext -a -t mysqld_db_t "/mnt(/.*)?"
335 | restorecon -Rv /mnt
336 | ```
337 |
338 | Sau khi hoàn thành các bước trên, chúng ta `umount` filesystem và stop MariaDB.
339 |
340 | ```
341 | umount /mnt
342 | systemctl stop mariadb
343 | ```
344 |
345 | Chúng ta sửa file cấu hình trên 2 node với nội dung như sau:
346 |
347 | ```
348 | vi /etc/my.cnf
349 | ```
350 |
351 | ```
352 | [mysqld]
353 | symbolic-links=0
354 | bind_address = 0.0.0.0
355 | datadir = /var/lib/mysql
356 | pid_file = /var/run/mariadb/mysqld.pid
357 | socket = /var/run/mariadb/mysqld.sock
358 |
359 | [mysqld_safe]
360 | bind_address = 0.0.0.0
361 | datadir = /var/lib/mysql
362 | pid_file = /var/run/mariadb/mysqld.pid
363 | socket = /var/run/mariadb/mysqld.sock
364 |
365 | !includedir /etc/my.cnf.d
366 | ```
367 |
368 |
369 | ### 2.5 Cấu hình Pacemaker
370 |
371 | Chúng ta sẽ cấu hình cho pacemaker tự động theo logic các dịch vụ như sau:
372 |
373 | - Khi Start: mysql_fs01 -> mysql_service01 -> mysql_VIP01
374 | - Khi Stop: mysql_VIP01 -> mysql_service01 -> mysql_fs01
375 |
376 | Trong đó:
377 |
378 | `mysql_fs01`: là tài nguyên filesystem
379 | `mysql_service01`: là dịch vụ MariaDB
380 | `mysql_VIP01`: là một Virtual IP ở bài viết tôi sử dụng 192.168.100.123
381 |
382 | Chúng ta cấu hình trên node thứ nhất của cụm (pcmk01):
383 |
384 | Tạo một CIB - lưu trữ và đồng bộ thông tin tài nguyên của các node
385 |
386 | ```
387 | pcs cluster cib clust_cfg
388 | ```
389 |
390 | Tắt STONITH và QUORUM:
391 |
392 | ```
393 | pcs -f clust_cfg property set stonith-enabled=false
394 | pcs -f clust_cfg property set no-quorum-policy=ignore
395 | ```
396 |
397 | Cấu hình thời để giảm downtime, tăng cường khả năng phục hồi:
398 |
399 | ```
400 | pcs -f clust_cfg resource defaults resource-stickiness=200
401 | ```
402 |
403 | Tạo một cụm tài nguyên có tên là `mysql-data01` cho DRDB và tạo một clone chạy đồng thời với nó
404 |
405 | ```
406 | pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd \
407 | drbd_resource=mysql01 \
408 | op monitor interval=30s
409 | ```
410 |
411 | ```
412 | pcs -f clust_cfg resource master MySQLClone01 mysql_data01 \
413 | master-max=1 master-node-max=1 \
414 | clone-max=2 clone-node-max=1 \
415 | notify=true
416 | ```
417 |
418 | Tạo một cụm cluster tài nguyên có tên là `mysql_fs01` cho filesystem. Và cấu hình cho các tài nguyên cùng chạy trên một node
419 |
420 | ```
421 | pcs -f clust_cfg resource create mysql_fs01 Filesystem \
422 | device="/dev/drbd0" \
423 | directory="/var/lib/mysql" \
424 | fstype="ext4"
425 |
426 | pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 \
427 | INFINITY with-rsc-role=Master
428 |
429 | pcs -f clust_cfg constraint order promote MySQLClone01 then start mysql_fs01
430 | ```
431 |
432 | Tương tự, chúng ta cũng tạo một tài nguyên `mysql_service01` cho MariaDB
433 |
434 | ```
435 | pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql \
436 | binary="/usr/bin/mysqld_safe" \
437 | config="/etc/my.cnf" \
438 | datadir="/var/lib/mysql" \
439 | pid="/var/lib/mysql/mysql.pid" \
440 | socket="/var/lib/mysql/mysql.sock" \
441 | additional_parameters="--bind-address=0.0.0.0" \
442 | op start timeout=60s \
443 | op stop timeout=60s \
444 | op monitor interval=20s timeout=30s
445 |
446 | pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY
447 |
448 | pcs -f clust_cfg constraint order mysql_fs01 then mysql_service01
449 | ```
450 |
451 | Cuối cùng, chúng ta tạo một cụm tài nguyên cho VIP với tên `mysql_VIP01`
452 |
453 | ```
454 | pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 \
455 | ip=192.168.100.123 cidr_netmask=32 \
456 | op monitor interval=30s
457 | ```
458 |
459 | Cấu hình cho chạy trên 1 node và khởi động trước cụm tài nguyên `mysql_service01`
460 |
461 | ```
462 | pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service01 INFINITY
463 |
464 | pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01
465 | ```
466 |
467 | Kiểm tra lại những cấu hình
468 |
469 | ```
470 | pcs -f clust_cfg constraint
471 |
472 | Location Constraints:
473 | Ordering Constraints:
474 | promote MySQLClone01 then start mysql_fs01 (kind:Mandatory)
475 | start mysql_fs01 then start mysql_service01 (kind:Mandatory)
476 | start mysql_service01 then start mysql_VIP01 (kind:Mandatory)
477 | Colocation Constraints:
478 | mysql_fs01 with MySQLClone01 (score:INFINITY) (with-rsc-role:Master)
479 | mysql_service01 with mysql_fs01 (score:INFINITY)
480 | mysql_VIP01 with mysql_service01 (score:INFINITY)
481 | ```
482 |
483 | ```
484 | pcs -f clust_cfg resource show
485 |
486 | Master/Slave Set: MySQLClone01 [mysql_data01]
487 | Stopped: [ pcmk01-cr pcmk02-cr ]
488 | mysql_fs01 (ocf::heartbeat:Filesystem): Stopped
489 | mysql_service01 (ocf::heartbeat:mysql): Stopped
490 | mysql_VIP01 (ocf::heartbeat:IPaddr2): Stopped
491 | ```
492 |
493 | Áp dụng những thay đổi vừa cấu hình
494 |
495 | ```
496 | pcs cluster cib-push clust_cfg
497 | ```
498 |
499 | Xem trạng thái:
500 |
501 | ```
502 | [pcmk01]# pcs status
503 | [...]
504 |
505 | Online: [ pcmk01-cr pcmk02-cr ]
506 |
507 | Full list of resources:
508 |
509 | Master/Slave Set: MySQLClone01 [mysql_data01]
510 | Masters: [ pcmk01-cr ]
511 | Stopped: [ pcmk02-cr ]
512 | mysql_fs01 (ocf::heartbeat:Filesystem): Started pcmk01-cr
513 | mysql_service01 (ocf::heartbeat:mysql): Started pcmk01-cr
514 | mysql_VIP01 (ocf::heartbeat:IPaddr2): Started pcmk01-cr
515 |
516 | [...]
517 | ```
518 |
519 |
520 |
521 | ## 3. Tham khảo
522 |
523 | - Nguồn: https://www.lisenet.com/2016/activepassive-mysql-high-availability-pacemaker-cluster-with-drbd-on-centos-7/
--------------------------------------------------------------------------------
/HA-cho-MariaDB-tren-CentOS7/db-cent7.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | echo -e "Huong dan cai dat:
4 | - Chuan bi:
5 | + SSH-Key cua node 2 voi ten 'node2'
6 | + Volume Group moi ten centos co dung luong lon hon 1GB
7 | + Khai bao thong tin vao file var.conf (IP, Node name, VIP, PASSWORD cua hacluster)"
8 | read -p "Bam ENTER de cai dat, CTRL + C de huy bo."
9 |
10 | source var.conf
11 | echo -e "\n$IP1 $HOST1 $HOST1-cr $HOST1-drbd
12 | $IP2 $HOST2 $HOST2-cr $HOST2-drbd
13 | $VIP pcmkvip" >> /etc/hosts
14 | scp -i node2 /etc/hosts root@$HOST2:/etc/
15 | hostnamectl set-hostname $HOST1
16 | ssh -i node2 root@$HOST2 "hostnamectl set-hostname $HOST2"
17 | echo -e "net.ipv6.conf.all.disable_ipv6 = 1
18 | net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
19 | scp -i node2 /etc/sysctl.conf root@$HOST2:/etc/
20 | sysctl -p
21 | ssh -i node2 root@$HOST2 "sysctl -p"
22 | yum install -y pcs
23 | ssh -i node2 root@$HOST2 "yum install -y pcs"
24 | yum install -y policycoreutils-python
25 | ssh -i node2 root@$HOST2 "yum install -y policycoreutils-python"
26 | echo $PASSWORD | passwd hacluster --stdin
27 | ssh -i node2 root@$HOST2 "echo $PASSWORD | passwd hacluster --stdin"
28 | systemctl start pcsd.service && systemctl enable pcsd.service
29 | ssh -i node2 root@$HOST2 "systemctl start pcsd.service && systemctl enable pcsd.service"
30 | pcs cluster auth $HOST1 $HOST2 -u hacluster -p $PASSWORD --force
31 | pcs cluster setup --name mysql_cluster $HOST1 $HOST2 --force
32 | pcs cluster start --all
33 |
34 | #DRBD
35 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
36 | ssh -i node2 root@$HOST2 "rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org"
37 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
38 | ssh -i node2 root@$HOST2 "rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm"
39 | yum install -y kmod-drbd84 drbd84-utils
40 | ssh -i node2 root@$HOST2 "yum install -y kmod-drbd84 drbd84-utils"
41 | semanage permissive -a drbd_t
42 | ssh -i node2 root@$HOST2 "semanage permissive -a drbd_t"
43 |
44 | # Chuan bi VG co ten 'centos' dung luong 1GB
45 |
46 | lvcreate --name lv_drbd --size 1024M centos
47 | ssh -i node2 root@$HOST2 "lvcreate --name lv_drbd --size 1024M centos"
48 |
49 | cat << EOL >/etc/drbd.d/mysql01.res
50 | resource mysql01 {
51 | protocol C;
52 | meta-disk internal;
53 | device /dev/drbd0;
54 | disk /dev/centos/lv_drbd;
55 | handlers {
56 | split-brain "/usr/lib/drbd/notify-split-brain.sh root";
57 | }
58 | net {
59 | allow-two-primaries no;
60 | after-sb-0pri discard-zero-changes;
61 | after-sb-1pri discard-secondary;
62 | after-sb-2pri disconnect;
63 | rr-conflict disconnect;
64 | }
65 | disk {
66 | on-io-error detach;
67 | }
68 | syncer {
69 | verify-alg sha1;
70 | }
71 | on $HOST1 {
72 | address $IP1:7789;
73 | }
74 | on $HOST2 {
75 | address $IP2:7789;
76 | }
77 | }
78 | EOL
79 | scp -i node2 /etc/drbd.d/mysql01.res root@$HOST2:/etc/drbd.d/
80 | drbdadm create-md mysql01
81 | ssh -i node2 root@$HOST2 "drbdadm create-md mysql01"
82 | drbdadm up mysql01
83 | ssh -i node2 root@$HOST2 "drbdadm up mysql01"
84 | drbdadm primary --force mysql01
85 | echo "Dang dong bo du lieu"
86 | a=`drbd-overview | grep -w "Connected"`
87 | while [ "$a" = "" ]; do sleep 10; a=`drbd-overview | grep -w "Connected"`; done;
88 | mkfs.ext4 -m 0 -L drbd /dev/drbd0
89 | tune2fs -c 30 -i 180d /dev/drbd0
90 | mount /dev/drbd0 /mnt
91 |
92 | ####### Cai dat MariaDB
93 | yum install -y mariadb-server mariadb
94 | ssh -i node2 root@$HOST2 "yum install -y mariadb-server mariadb"
95 | systemctl disable mariadb.service
96 | ssh -i node2 root@$HOST2 "systemctl disable mariadb.service"
97 | systemctl start mariadb
98 | mysql_install_db --datadir=/mnt --user=mysql
99 | semanage fcontext -a -t mysqld_db_t "/mnt(/.*)?"
100 | restorecon -Rv /mnt
101 | umount /mnt
102 | systemctl stop mariadb
103 |
104 | cat << EOL > /etc/my.cnf
105 | [mysqld]
106 | symbolic-links=0
107 | bind_address = 0.0.0.0
108 | datadir = /var/lib/mysql
109 | pid_file = /var/run/mariadb/mysqld.pid
110 | socket = /var/run/mariadb/mysqld.sock
111 |
112 | [mysqld_safe]
113 | bind_address = 0.0.0.0
114 | datadir = /var/lib/mysql
115 | pid_file = /var/run/mariadb/mysqld.pid
116 | socket = /var/run/mariadb/mysqld.sock
117 |
118 | !includedir /etc/my.cnf.d
119 | EOL
120 | scp -i node2 /etc/my.cnf root@$HOST2:/etc/
121 |
122 | ### Cau hinh cluster
123 |
124 | pcs cluster cib clust_cfg
125 | pcs -f clust_cfg property set stonith-enabled=false
126 | pcs -f clust_cfg property set no-quorum-policy=ignore
127 | pcs -f clust_cfg resource defaults resource-stickiness=200
128 |
129 | pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd drbd_resource=mysql01 op monitor interval=30s
130 | pcs -f clust_cfg resource master MySQLClone01 mysql_data01 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
131 | pcs -f clust_cfg resource create mysql_fs01 Filesystem device="/dev/drbd0" directory="/var/lib/mysql" fstype="ext4"
132 | pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 INFINITY with-rsc-role=Master
133 | pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" pid="/var/lib/mysql/mysql.pid" socket="/var/lib/mysql/mysql.sock" additional_parameters="--bind-address=0.0.0.0" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s
134 | pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY
135 | pcs -f clust_cfg constraint order mysql_fs01 then mysql_service01
136 | pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 ip=$VIP cidr_netmask=32 op monitor interval=30s
137 | pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service01 INFINITY
138 | pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01
139 | pcs -f clust_cfg constraint
140 | pcs -f clust_cfg resource show
141 | pcs cluster cib-push clust_cfg
142 | pcs status
--------------------------------------------------------------------------------
/HA-cho-MariaDB-tren-CentOS7/var.conf:
--------------------------------------------------------------------------------
1 | export PASSWORD=abc@123
2 | export IP1=192.168.100.196
3 | export IP2=192.168.100.197
4 | export VIP=192.168.100.123
5 | export HOST1=node1
6 | export HOST2=node2
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Ghi chép về các kỹ thuật/giải pháp HA cho mysql/mariadb
2 |
3 | ### Mục lục:
4 | - [1. Giới thiệu về HA cho DB ](#1)
5 | - [2. Các giải giải pháp ](#2)
6 | - [2.1 Giải pháp có sẵn ](#2.1)
7 | - [2.1.1 Master - Slave ](#2.1.1)
8 | - [2.1.2 Master - Master ](#2.1.2)
9 | - [2.2 Giải pháp bên thứ 3 (3rd party) ](#2.2)
10 | - [2.2.1 Galera](#2.2.1)
11 | - [2.2.2 DRBD ](#2.2.2)
12 | - [2.2.3 Radundant Hardware ](#2.2.3)
13 | - [2.2.4 Shared Storage ](#2.2.4)
14 | - [2.2.5 MySQL clustering ](#2.2.5)
15 | - [2.2.6 Percona cluster ](#2.2.6)
16 | - [3. Kết luận ](#3)
17 |
18 |
19 |
20 | ## 1. Giới thiệu về HA
21 |
22 | Ngày nay, công nghệ thông tin đã ăn sâu vào nhiều lĩnh vực trong đời sống phục vụ cho sản xuất, giải trí và đặc biệt nhu cầu thông tin. Các hệ thống này luôn được đầu tư với quy mô càng ngày càng mở rộng, là hướng phát triển trọng tâm của doanh nghiệp cung cấp nội dung. Để đảm bảo các dịch vụ chạy thông suốt, phục vụ tối đa đến nhu cầu của người sử dụng và nâng cao tính bảo mật, an toàn dữ liệu; giải pháp High Availability được nghiên cứu và phát triển bởi nhiều hãng công nghệ lớn. Với Database, tính an toàn và khả dụng được đặt lên hàng đầu. Vì vậy, ở bài viết này, chúng tôi xin phép điểm qua một vài Giải pháp HA cho hệ cơ sở dữ liệu sử dụng MySQL hoặc MariaDB đang được cộng đồng tin dùng.
23 |
24 | ### HA giải quyết được gì?
25 |
26 | - Tăng tính hoạt động sẵn sàng dữ liệu mọi lúc mọi nơi
27 | - Nâng cao hiệu suất làm việc của hệ thống
28 | - Nâng cao được tính an toàn dữ liệu
29 | - Đảm bảo hệ thống làm việc không bị gián đoạn
30 |
31 | ## 2. Các giải pháp
32 |
33 | Có 2 giải pháp chính cho việc HA:
34 |
35 | - Giải pháp Native: Giải pháp này được mysql/mariadb hỗ trợ.
36 | - Master - Slave
37 | - Master - Master
38 |
39 | - Giải pháp 3rd party: Cùng với mục đích là để nhất quán dữ liệu với các server với nhau nhưng cơ chế hoạt động và mô hình khác với giải pháp Native. Một số kỹ thuật mà chúng tôi đã tìm hiểu là:
40 | - Galera
41 | - [DRBD](https://github.com/hoangdh/ghichep-drbd)
42 |
43 |
44 |
45 | ### 2.1 Giải pháp Native
46 |
47 | Cơ chế làm việc như sau: Trên mỗi server sẽ có một user làm nhiệm vụ replication dữ liệu mục đích của việc này là giúp các server đảm bảo tính nhất quán về dữ liệu với nhau.
48 |
49 | **Replication** là tính năng cho phép dữ liệu của (các) máy chủ Master được sao chép/nhân bản trên một hoặc nhiều máy chủ khác (Slave). Mục đích của việc này là để sao lưu dữ liệu ra các máy chủ khác đề phòng máy chủ chính gặp sự cố.
50 |
51 | **Có thể sao chép/nhân bản được những gì?**
52 |
53 | Tùy vào mục đích sử dụng, tính năng này cho phép chúng ta sao chép/nhân bản từ Tất cả các DB trên Master, một hoặc nhiều DB, cho đến các bảng trong mỗi DB sang Slave một cách tự động.
54 |
55 | **Cơ chế hoạt động**
56 |
57 | Máy chủ Master sẽ gửi các binary-log đến máy chủ Slave. Máy chủ Slave sẽ đọc các binary-log từ Master để yêu cầu truy cập dữ liệu vào quá trình replication. Một relay-log được tạo ra trên slave, nó sử dụng định dạng giống với binary-log. Các relay-log sẽ được sử dụng để replication và được xóa bỏ khi hoàn tất quá trình replication.
58 |
59 | Các master và slave không nhất thiết phải luôn kết nối với nhau. Nó có thể được đưa về trạng thái offline và khi được kết nối lại, quá trình replication sẽ được tiếp tục ở thời điểm nó offline.
60 |
61 | **Binary-log là gì?**
62 |
63 | Binary-log chứa những bản ghi ghi lại những thay đổi của các database. Nó chứa dữ liệu và cấu trúc của DB (có bao nhiêu bảng, bảng có bao nhiêu trường,...), các câu lệnh được thực hiện trong bao lâu,... Nó bao gồm các file nhị phân và các index.
64 |
65 | Binary-log được lưu trữ ở dạng nhị phân không phải là dạng văn bản plain-text.
66 |
67 |
68 |
69 | #### 2.1.1 Master - Slave
70 | **Master - Slave**: là một kiểu trong giải pháp HA cho DB, mục đích để đồng bộ dữ liệu của DB chính (Master) sang một máy chủ DB khác gọi là Slave một cách tự động.
71 |
72 |
73 |
74 | Tham khảo cách [cấu hình](docs/2-replica-master-slave.md).
75 |
76 |
77 |
78 | #### 2.1.2 Master - Master
79 |
80 | **Master - Master**: Khi cấu hình kiểu này, 2 DB sẽ tự động đồng bộ dữ liệu cho nhau.
81 |
82 |
83 |
84 | ## 2.2 Giải pháp 3rd party
85 |
86 |
87 |
88 | ### 2.2.1 Galera
89 |
90 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng.
91 |
92 |
93 |
94 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**:
95 |
96 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive.
97 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node
98 |
99 | Hướng dẫn cài đặt trên:
100 |
101 | - [Ubuntu](https://github.com/hoangdh/ghichep-database/tree/master/Galera_on_Ubuntu)
102 | - [CentOS](https://github.com/hoangdh/ghichep-database/tree/master/Galera_on_CentOS)
103 |
104 |
105 |
106 | ### 2.2.2 DRBD (Distributed Replicated Block Device)
107 |
108 | #### Khái niệm/Định nghĩa
109 |
110 | - Phục vụ cho việc sao chép dữ liệu từ một thiết bị này sang thiết bị khác, đảm bảo dữ liệu luôn được đồng nhất giữa 2 thiết bị
111 | - Việc sao chép là liên tục do ánh xạ với nhau ở mức thời gian thực
112 | - Được ví như RAID 1 qua mạng
113 | - Bonus: [Bài viết chi tiết](https://github.com/hoangdh/ghichep-drbd)
114 |
115 | #### Nhiệm vụ của DRDB trong HA mysql/mariadb
116 |
117 | - Khi được cài đặt trên các cụm cluter, DRBD đảm nhiệm việc đồng bộ dữ liệu của các server trong cụm cluters với nhau
118 |
119 | #### Kết hợp với heartbeat
120 |
121 | - Là một tiện ích chạy ngầm trên máy master để kiểm tra trạng thái hoạt động. Khi máy master xảy ra sự cố, heartbeat sẽ khởi động các dịch vụ ở máy phụ để phục vụ thay máy master.
122 |
123 |
124 |
125 |
126 | ### 2.2.3 Radundant Hardware - Sử dụng tài nguyên phần cứng
127 |
128 | Thuật ngữ 'Two of Everything", nghĩa là sử dụng 2 tài nguyên phần cứng cho một máy chủ. Có nghĩa rằng một máy chủ sẽ có 2 nguồn cấp điện, 2 ổ cứng, 2 card mạng,...
129 |
130 |
131 |
132 | ### 2.2.4 Shared Storage
133 |
134 | Để khắc phục lại những sự cố mà server có thể gặp phải, một máy chủ backup được cấu hình nhằm mục đích sao lưu và duy trì các hoạt động khi server chính bị lỗi. Sử dụng NAS hoặc SAN bên trong các server để đồng bộ dữ liệu giữa các máy chủ với nhau.
135 |
136 |
137 |
138 |
139 |
140 | ### 2.2.5 MySQL clustering
141 |
142 | Với các Database lớn, clustering làm nhiệm vụ chia nhỏ dữ liệu và phân phối vào các server nằm ở bên trong cụm máy chủ cluster. Trong trường hợp một máy chủ bị lỗi, dữ liệu vẫn được lấy từ các node khác đảm bảo hoạt động của người dùng không bị gián đoạn.
143 |
144 |
145 |
146 | ### 2.2.6 Percona cluster
147 |
148 | Giống với Galera, Percona có ít nhất 3 node luôn đồng bộ dữ liệu với nhau. Dữ liệu có thể được đọc/ghi lên bất kỳ node nào trong mô hình. Một máy chủ đứng ở bên trên tiếp nhận các truy vấn và phân phối lại một cách đồng đều cho các server bên dưới.
149 |
150 |
151 |
152 |
153 |
154 | ### 3. Kết luận
155 |
156 | Nâng cao khả năng hoạt động cho cơ sở dữ liệu là điều vô cùng quan trọng, nó giúp các ứng dụng sử dụng DB của bạn hoạt động nhịp nhàng, trơn tru hơn. Trên đây là một vài giải pháp nâng cao hiệu năng hoạt động của DB. Dựa vào điều kiện thực tế mà có thể lựa chọn giải pháp phù hợp với mô hình của mình.
157 |
--------------------------------------------------------------------------------
/db-cent7-2.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | echo -e "Huong dan cai dat:
3 | - Chuan bi:
4 | + SSH-Key cua node 2 voi ten 'node2'
5 | + Volume Group moi ten centos co dung luong lon hon 1GB
6 | + Khai bao thong tin vao file var.conf (IP, Node name, VIP, PASSWORD cua hacluster)"
7 | read -p "Bam ENTER de cai dat, CTRL + C de huy bo."
8 |
9 | source var.conf
10 | echo -e "$IP1 $HOST1 $HOST1-cr $HOST1-drbd
11 | $IP2 $HOST2 $HOST2-cr $HOST2-drbd
12 | $VIP pcmkvip" >> /etc/hosts
13 | scp -i node2 /etc/hosts root@$HOST2:/etc/
14 | hostnamectl set-hostname $HOST1
15 | ssh -i node2 root@$HOST2 "hostnamectl set-hostname $HOST2"
16 | ssh -i node2 root@$HOST2
17 | echo -e "net.ipv6.conf.all.disable_ipv6 = 1
18 | net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
19 | scp -i node2 /etc/sysctl.conf root@$HOST2:/etc/
20 | sysctl -p
21 | ssh -i node2 root@$HOST2 "sysctl -p"
22 | yum install -y pcs
23 | ssh -i node2 root@$HOST2 "yum install -y pcs"
24 | yum install -y policycoreutils-python
25 | ssh -i node2 root@$HOST2 "yum install -y policycoreutils-python"
26 | echo $PASSWORD | passwd hacluster --stdin
27 | ssh -i node2 root@$HOST2 "echo $PASSWORD | passwd hacluster --stdin"
28 | systemctl start pcsd.service && systemctl enable pcsd.service
29 | ssh -i node2 root@$HOST2 "systemctl start pcsd.service && systemctl enable pcsd.service"
30 | pcs cluster auth $HOST1-cr $HOST2-cr -u hacluster -p $PASSWORD
31 | pcs cluster setup --name mysql_cluster $HOST1-cr $HOST2-cr
32 | pcs cluster start --all
33 |
34 | #DRBD
35 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
36 | ssh -i node2 root@$HOST2 "rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org"
37 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
38 | ssh -i node2 root@$HOST2 "rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm"
39 | yum install -y kmod-drbd84 drbd84-utils
40 | ssh -i node2 root@$HOST2 "yum install -y kmod-drbd84 drbd84-utils"
41 | semanage permissive -a drbd_t
42 | ssh -i node2 root@$HOST2 "semanage permissive -a drbd_t"
43 |
44 | ## Chuan bi VG co ten 'centos' dung luong 1GB
45 |
46 | lvcreate --name lv_drbd --size 1024M centos
47 | ssh -i node2 root@$HOST2 "lvcreate --name lv_drbd --size 1024M centos"
48 |
49 | cat << EOL >/etc/drbd.d/mysql01.res
50 | resource mysql01 {
51 | protocol C;
52 | meta-disk internal;
53 | device /dev/drbd0;
54 | disk /dev/centos/lv_drbd;
55 | handlers {
56 | split-brain "/usr/lib/drbd/notify-split-brain.sh root";
57 | }
58 | net {
59 | allow-two-primaries no;
60 | after-sb-0pri discard-zero-changes;
61 | after-sb-1pri discard-secondary;
62 | after-sb-2pri disconnect;
63 | rr-conflict disconnect;
64 | }
65 | disk {
66 | on-io-error detach;
67 | }
68 | syncer {
69 | verify-alg sha1;
70 | }
71 | on $HOST1 {
72 | address $IP1:7789;
73 | }
74 | on HOST2 {
75 | address $IP2:7789;
76 | }
77 | }
78 | EOL
79 | scp -i node2 /etc/drbd.d/mysql01.res root@$HOST2:/etc/drbd.d/
80 | drbdadm create-md mysql01
81 | ssh -i node2 root@$HOST2 "drbdadm create-md mysql01"
82 | drbdadm up mysql01
83 | ssh -i node2 root@$HOST2 "drbdadm up mysql01"
84 | drbdadm primary --force mysql01
85 | drbd-overview
86 | mkfs.ext4 -m 0 -L drbd /dev/drbd0
87 | tune2fs -c 30 -i 180d /dev/drbd0
88 | mount /dev/drbd0 /mnt
89 |
90 | # Cai dat MariaDB
91 | yum install -y mariadb-server mariadb
92 | ssh -i node2 root@$HOST2 "yum install -y mariadb-server mariadb"
93 | systemctl disable mariadb.service
94 | ssh -i node2 root@$HOST2 "systemctl disable mariadb.service"
95 | systemctl start mariadb
96 | mysql_install_db --datadir=/mnt --user=mysql
97 | semanage fcontext -a -t mysqld_db_t "/mnt(/.*)?"
98 | restorecon -Rv /mnt
99 | umount /mnt
100 | systemctl stop mariadb
101 |
102 | cat << EOL > /etc/my.cnf
103 | [mysqld]
104 | symbolic-links=0
105 | bind_address = 0.0.0.0
106 | datadir = /var/lib/mysql
107 | pid_file = /var/run/mariadb/mysqld.pid
108 | socket = /var/run/mariadb/mysqld.sock
109 |
110 | [mysqld_safe]
111 | bind_address = 0.0.0.0
112 | datadir = /var/lib/mysql
113 | pid_file = /var/run/mariadb/mysqld.pid
114 | socket = /var/run/mariadb/mysqld.sock
115 |
116 | !includedir /etc/my.cnf.d
117 | EOL
118 | scp -i node2 /etc/my.cnf root@$HOST2:/etc/
119 |
120 | # Cau hinh cluster
121 |
122 | pcs cluster cib clust_cfg
123 | pcs -f clust_cfg property set stonith-enabled=false
124 | pcs -f clust_cfg property set no-quorum-policy=ignore
125 | pcs -f clust_cfg resource defaults resource-stickiness=200
126 |
127 | pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd drbd_resource=mysql01 op monitor interval=30s
128 | pcs -f clust_cfg resource master MySQLClone01 mysql_data01 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
129 | pcs -f clust_cfg resource create mysql_fs01 Filesystem device="/dev/drbd0" directory="/var/lib/mysql" fstype="ext4"
130 | pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 INFINITY with-rsc-role=Master
131 | pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" pid="/var/lib/mysql/mysql.pid" socket="/var/lib/mysql/mysql.sock" additional_parameters="--bind-address=0.0.0.0" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s
132 | pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY
133 | pcs -f clust_cfg constraint order mysql_fs01 then mysql_service01
134 | pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 ip=$VIP cidr_netmask=32 op monitor interval=30s
135 | pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service01 INFINITY
136 | pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01
137 | pcs -f clust_cfg constraint
138 | pcs -f clust_cfg resource show
139 | pcs cluster cib-push clust_cfg
140 | pcs status
--------------------------------------------------------------------------------
/docs/1-install-mysql-community-from-repository.md:
--------------------------------------------------------------------------------
1 | ## Cài đặt thông qua Repository của MySQL Community
2 |
3 | ### 1. Cài đặt Repository của MySQL
4 |
5 | ```
6 | yum install -y yum-utils
7 | rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
8 | ```
9 |
10 | Trong ví dụ này, ta sẽ cài đặt MySQL bản 5.7. Mặc định, repo của bản 8.0 (mới nhất trong thời điểm viết bài) được kích hoạt. Do vậy, ta sẽ kích hoạt bản 5.7 và tắt bản 8.0.
11 |
12 | ```
13 | yum-config-manager --disable mysql80-community
14 | yum-config-manager --enable mysql57-community
15 | ```
16 |
17 | Kiểm tra lại thông tin của gói cài đặt `mysql-community-server`
18 |
19 | > yum info mysql-community-server.x86_64
20 |
21 | ### 2. Cài đặt MySQL
22 |
23 | Sau khi kích hoạt, ta sử dụng lệnh sau để cài đặt `mysql-community` bản 5.7
24 |
25 | > yum install -y mysql-community-server.x86_64
26 |
27 | Chờ khoảng 3-5p, tùy thuộc vào tốc độ mạng và cấu hình máy chủ của bạn.
28 |
29 | Khởi động và kích hoạt MySQL
30 |
31 | ```
32 | systemctl start mysqld
33 | systemctl enable mysqld
34 | ```
35 |
36 | ### 3. Cấu hình MySQL
37 |
38 | #### 3.1 Lấy mật khẩu tạm thời của `root`
39 |
40 | Từ bản 5.6, mỗi khi cài đặt mới thì mật khẩu của user `root` - quản trị của MySQL được lưu trữ trong log của MySQL tại `/var/log/mysqld.log`
41 |
42 | > grep -oP "temporary password(.*): \K(\S+)" /var/log/mysqld.log
43 |
44 | #### 3.2 Cấu hình cơ bản MySQL
45 |
46 | Sử dụng câu lệnh `mysql_secure_installation` để thay đổi mật khẩu root và xóa bỏ CSDL test, user test,...
47 |
48 | Đăng nhập bằng mật khẩu tạm thời và thay đổi mật khẩu với độ bảo mật cao (Bao gồm chữ HOA, chữ thường, số và một số ký tự đặc biệt)
49 |
50 | ```
51 | # mysql_secure_installation
52 |
53 | Securing the MySQL server deployment.
54 |
55 | Enter password for user root:
56 |
57 | The existing password for the user account root has expired. Please set a new password.
58 |
59 | New password:
60 |
61 | Re-enter new password:
62 | The 'validate_password' plugin is installed on the server.
63 | The subsequent steps will run with the existing configuration
64 | of the plugin.
65 | Using existing password for root.
66 |
67 | Estimated strength of the password: 100
68 | Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
69 |
70 | ... skipping.
71 | By default, a MySQL installation has an anonymous user,
72 | allowing anyone to log into MySQL without having to have
73 | a user account created for them. This is intended only for
74 | testing, and to make the installation go a bit smoother.
75 | You should remove them before moving into a production
76 | environment.
77 |
78 | Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
79 | Success.
80 |
81 |
82 | Normally, root should only be allowed to connect from
83 | 'localhost'. This ensures that someone cannot guess at
84 | the root password from the network.
85 |
86 | Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
87 | Success.
88 |
89 | By default, MySQL comes with a database named 'test' that
90 | anyone can access. This is also intended only for testing,
91 | and should be removed before moving into a production
92 | environment.
93 |
94 |
95 | Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
96 | - Dropping test database...
97 | Success.
98 |
99 | - Removing privileges on test database...
100 | Success.
101 |
102 | Reloading the privilege tables will ensure that all changes
103 | made so far will take effect immediately.
104 |
105 | Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
106 | Success.
107 |
108 | All done!
109 | ```
110 |
111 | #### Sử dụng chính sách mật khẩu kém bảo mật
112 |
113 | Từ bản 5.6, MySQL mặc định sử dụng chính sách mật khẩu bảo mật ở mức cao, điều này dẫn tới nhiều rắc rối khi một số Tool tự động tạo user MySQL để cài đặt 'khốn đốn'. Để tắt tính năng này, ta sử dụng một trong những cách sau:
114 |
115 | - C1: Thêm vào file cấu hình `/etc/my.cnf`
116 |
117 | ```
118 | [mysqld]
119 | ...
120 | validate_password_policy=LOW
121 | ...
122 | ```
123 |
124 | - C2: Sử dụng câu lệnh
125 |
126 | > mysql -uroot -p -e "SET GLOBAL validate_password_policy=LOW"
127 |
--------------------------------------------------------------------------------
/docs/2-replica-master-slave.md:
--------------------------------------------------------------------------------
1 | ## Cấu hình MySQL Replication Master - Slave
2 |
3 | MySQL replication là một tiến trình cho phép sao chép dữ liệu của MySQL một cách tự động từ máy chủ Master sang máy chủ Slave. Nó vô cùng hữu ích cho việc backup dữ liệu hoặc sử dụng để phân tích mà không cần thiết phải truy vấn trực tiếp tới CSDL chính hay đơn giản là để mở rộng mô hình.
4 |
5 | Bài lab này sẽ thực hiện với mô hình 2 máy chủ: 1 máy chủ master sẽ gửi thông tin, dữ liệu tới một máy chủ slave khác (Có thể chung hoặc khác hạ tầng mạng). Để thực hiện, trong ví dụ này sử dụng 2 IP:
6 |
7 | - IP Master: 10.10.10.1
8 | - IP Slave: 10.10.10.2
9 |
10 | ### 1. Cấu hình trên máy chủ Master
11 |
12 | #### Tạm dừng dịch vụ MySQL
13 |
14 | > systemctl stop mysqld
15 |
16 | #### Khai báo cấu hình cho Master
17 |
18 | Thêm các dòng sau vào file cấu hình `/etc/my.cnf`
19 |
20 | ```
21 | [mysqld]
22 | ...
23 | bind-address=10.10.10.1
24 | log-bin=/var/lib/mysql/mysql-bin
25 | server-id=101
26 | ```
27 |
28 | - `bind-address`: Cho phép dịch vụ lắng nghe trên IP. Mặc định là 127.0.0.1 - localhost
29 | - `log-bin`: Thư mục chứa log binary của MySQL, dữ liệu mà Slave lấy về thực thi công việc replicate.
30 | - `server-id`: Số định danh Server
31 |
32 | #### Khởi động dịch vụ MySQL
33 |
34 | > systemctl start mysqld
35 |
36 | Đăng nhập vào MySQL, tạo một user sử dụng trong quá trình replication
37 |
38 | > mysql -uroot -p
39 |
40 | ```
41 | mysql> grant replication slave on *.* to replica@'10.10.10.2' identified by 'password';
42 |
43 | Query OK, 0 rows affected (0.00 sec)
44 | mysql> flush privileges;
45 |
46 | ```
47 |
48 | Khóa tất cả các bảng và dump dữ liệu
49 |
50 | ```
51 | mysql> flush tables with read lock;
52 | mysql> show master status;
53 |
54 | +------------------+----------+--------------+------------------+-------------------+
55 | | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
56 | +------------------+----------+--------------+------------------+-------------------+
57 | | mysql-bin.000001 | 592 | | | |
58 | +------------------+----------+--------------+------------------+-------------------+
59 | 1 row in set (0.00 sec)
60 |
61 | ```
62 |
63 | > **Chú ý**: Ghi nhớ thông tin này để khai báo khi [cấu hình trên Slave](#2)
64 |
65 | Mở một cửa sổ terminal khác để dump dữ liệu
66 |
67 | > \# mysqldump -u root -p --all-databases --lock-all-tables --events > mysql_dump.sql
68 |
69 | Quá trình dump hoàn thành, quay trở lại terminal trước để Unlock các bảng
70 |
71 | ```
72 | mysql> unlock tables;
73 | mysql> exit
74 | ```
75 |
76 | Chuyển dữ liệu vừa dump sang máy chủ slave.
77 |
78 | ### 2. Cấu hình máy chủ Slave
79 |
80 | Thêm các dòng sau vào file cấu hình `my.cnf` trên máy chủ Slave. Mục đích là định danh máy chủ slave và chỉ ra nơi lưu trữ bin-log.
81 |
82 | ```
83 | [mysqld]
84 | ...
85 | log-bin=/var/lib/mysql/mysql-bin
86 | server-id=102
87 | ```
88 |
89 | Khởi động lại MySQL
90 |
91 | > systemctl restart mysqld
92 |
93 | Khôi phục lại dữ liệu vừa dump trên Master. Ví dụ, file dump được copy về để ở thư mục /tmp
94 |
95 | > mysql -u root -p < /tmp/mysql_dump.sql
96 |
97 | Sau khi xong, đăng nhập vào MySQL để cấu hình Repilcate Master Slave
98 |
99 | > mysql -uroot -p
100 |
101 | ```
102 | mysql> change master to
103 | -> master_host='10.10.10.1',
104 | -> master_user='replica',
105 | -> master_password='password',
106 | -> master_log_file='mysql-bin.000001',
107 | -> master_log_pos=592;
108 | mysql> start slave;
109 | mysql> show slave status\G
110 | ```
111 |
112 | **Chú ý**: Điền thông tin `log_file` và `log_pos` trùng khớp với thông số mà ta đã lấy ở bước [trên](#1).
113 |
114 |
115 | ### Bonus
116 |
117 | Ghi binlog ở slave để có thể thiết lập slave khác từ Slave; sử dụng trong Mô hình Master-Master:
118 |
119 | ```
120 | ...
121 | log_slave_updates = 1
122 | ```
123 |
124 |
--------------------------------------------------------------------------------
/docs/backup-mysql-to-minio-s3.md:
--------------------------------------------------------------------------------
1 | # Sao lưu và phục hồi dữ liệu MySQL lên S3 Minio sử dụng xbstream và xbcloud
2 |
3 | ## 1. Chuẩn bị
4 |
5 | - Percona Toolkit
6 | - MinIO
7 |
8 | ### Khai báo thông tin MinIO S3 cho xbcloud
9 |
10 | Thêm các thông tin MinIO tương ứng vào file `~/.my.cnf`
11 |
12 | > vim ~/.my.cnf
13 |
14 | ```
15 | ...
16 |
17 | [xbcloud]
18 | storage=s3
19 | s3-endpoint=http://localhost:9000/
20 | s3-access-key=minio
21 | s3-secret-key=minio123
22 | s3-bucket=backupsx
23 | s3-bucket-lookup=path
24 | s3-api-version=4
25 | ```
26 |
27 | ## 2. Các bước thực hiện
28 |
29 | ### 2.1 Quá trình sao lưu (Backup)
30 |
31 | ```
32 | THREADS=10
33 | CHUNKSIZE=200M
34 | HOST="$(hostname)-$(date -I)"
35 |
36 | xtrabackup --backup --stream=xbstream --parallel=$THREADS --read-buffer-size=$CHUNKSIZE --extra-lsndir=/data/tmp --target-dir=/data/tmp | xbcloud put --parallel=$THREADS $HOST
37 | ```
38 |
39 | - Trong đó:
40 | - `THREADS`: Số luồng xtrabackup chạy
41 | - `CHUNKSIZE`: Xác định kích thước của object trên MinIO, mặc định: 10MB.
42 | - `HOST`: Tên thư mục được lưu trên MinIO,. Ví dụ: `mysql1-2022-04-27`
43 | - **Chú ý:** Có thể thêm các tùy chọn vào lệnh `xtrabackup`. Ví dụ: `--slave-info`: Nếu thực hiện trên máy chủ Slave; ...
44 |
45 | ### 2.2 Quá trình phục hồi (Restore)
46 |
47 | Quá trình này cần 2 bước thực hiện là lấy dữ liệu từ S3 MinIO và `apply-log`
48 |
49 | #### Lấy dữ liệu từ MinIO
50 |
51 | ```
52 | THREADS=10
53 | HOST=mysql1-2022-04-27
54 | mkdir -p /data/restore-mysql/$HOST
55 |
56 | xbcloud get --parallel=$THREADS s3://backupsx/$HOST | xbstream -x --parallel=$THREADS -C /data/restore-mysql/$HOST
57 | ```
58 |
59 | - Trong đó:
60 | - `backupsx`: Tên bucket
61 | - `HOST`: Tên thư mục sao lưu trên MinIO ở bước trên.
62 |
63 | #### Quá trình Apply-log
64 |
65 | ```
66 | xtrabackup --prepare --use-memory=1G --apply-log-only --target-dir=/data/restore-mysql/$HOST
67 | ```
68 |
69 | ## 3. Tham khảo
70 |
71 | - https://docs.percona.com/percona-xtrabackup/2.4/xbcloud/xbcloud.html
72 |
--------------------------------------------------------------------------------
/docs/gtid-notes.md:
--------------------------------------------------------------------------------
1 | ### Khái niệm GTID
2 |
3 | GTID (Global Transaction Identifiers) được giới thiệu từ bản MySQL 5.6,
4 | - Là một mã định danh duy nhất khi một transaction được commmited trên máy chủ gốc (hay còn gọi là Master).
5 | - Mã định danh này tồn tại duy nhất trên toàn bộ các máy chủ MySQL (Bao gồm Master và các slave).
6 | - Giúp việc cấu hình Replicate đơn giản, dễ dàng; đảm bảo tính nhất quán và tin cậy.
7 |
8 | GTID bao gồm 2 phần:
9 | - ServerID: ID của Server, duy nhất theo dạng UUID. Được ghi vào file auto.conf khi khởi tạo MySQL; trong thư mục lưu trữ dữ liệu của MySQL.
10 | - TransactionID: Là ID của transaction; bắt đầu từ 1 và tăng dần theo thứ tự transaction.
11 |
12 | Ví dụ: `cef98fa3-5396-4ee0-85bb-cb1413d1531b:2135`
13 |
14 | ### Tính năng của GITD
15 |
16 | **Điểm khác nhau giữa GTID-based và log-based**
17 |
18 | - Với Log-based, Máy chủ Slave kêt nối tới Master sẽ phải khai báo file binlog và position.
19 | - Với GTID-based:
20 | - Trước hết, Slave sẽ gửi thông tin các GTID của các transaction đã được thực thi trên nó cho Master. Sau đó, Master sẽ gửi lại tất cả những transaction chưa được thực thi về Slave; Slave sẽ thực thi các transacction này. Và đảm bảo rằng chỉ thực hiện duy nhất một lần để đảm báo tính nhất quán dữ liệu.
21 | - Không cần sử dụng `MASTER_LOG_FILE` và `MASTER_LOG_POS`, chỉ cần khai báo `MASTER_AUTO_POSTION=1`
22 | - Khi sử dụng GITD, bắt buộc các máy chủ Slave cũng phải bật GITD
23 | - Tất cả các Slave phải ghi log; `log_slave_updates=1`
24 |
25 | ### Cách hoạt động
26 | - Khi một transaction được thực thi trên Master, một GTID được sinh ra, gắn tương ứng vào transaction rồi được ghi vào Binlog.
27 | - Binglog được Slave láy về lưu vào relay-log; Slave đọc GITD và gán giá trị vào biến `GTID_NEXT` để biết được GTID tiếp theo sẽ thực thi.
28 | - Tiến trình SQL thread trên Slave lấy giá trị GITD từ relay-log và so sánh với binlog. Nếu đã tồn tại, Slave sẽ bỏ qua. Nếu chưa, Slave sẽ thực thi và ghi chúng lại vào binlog của mình.
29 |
30 | ### Ưu điểm:
31 |
32 | - Cấu hình nhanh
33 | - Rút ngắn thời gian thao tác chuyển đổi dự phòng (Failover)
34 | - Tối ưu hơn với binlog là ROW
35 |
36 | ### Nhược điểm:
37 |
38 | - Khó trong việc xử lý khi lỗi xảy ra trên Slave (Không hỗ trợ slave_skip_counter, tuy nhiên có thao tác tương đương - bỏ qua transaction lỗi)
39 | - Không sử dụng được với MyISAM
40 | - Không hỗ trợ tạo bảng create table .. select; và bảng tạm (temporary)
41 |
--------------------------------------------------------------------------------
/drafts/GALERA-setup-ubuntu.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Add repo and setup MySQL Galera WSREP
4 |
5 | setup_Ubuntu()
6 | {
7 | apt-key adv --keyserver keyserver.ubuntu.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA
8 | add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main'
9 | debconf-set-selections <<< "mysql-server mysql-server/root_password password $PASSWORD"
10 | debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $PASSWORD"
11 | apt-get update
12 | apt-get install -y galera-3 galera-arbitrator-3 mysql-wsrep-5.6 rsync
13 | }
14 |
15 | # Configuring the Galera
16 |
17 | configure_Galera()
18 | {
19 |
20 | sed -i '/bind-address/ s/^#*/#/g' /etc/mysql/my.cnf
21 | ufw allow 3306,4567,4568,4444/tcp
22 | ufw allow 4567/udp
23 | systemctl stop mysql
24 | }
25 |
26 | # Start the node 1 on Ubuntu
27 |
28 | start_node1_Ubuntu()
29 | {
30 | /etc/init.d/mysql start --wsrep-new-cluster
31 | mysql -uroot -p$PASSWORD -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
32 | mysql -uroot -p$PASSWORD -e "update mysql.user set password=PASSWORD('03P8rdlknkXr1upf_H2') where User='debian-sys-maint';"
33 | }
34 |
35 | # Start the remain nodes on Ubuntu
36 |
37 | start_Ubuntu()
38 | {
39 | systemctl start mysql
40 | mysql -uroot -p$PASSWORD -e "update mysql.user set password=PASSWORD('03P8rdlknkXr1upf_H2') where User='debian-sys-maint';"
41 | mysql -uroot -p$PASSWORD -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
42 | sleep 3
43 | }
44 |
45 | # Configuring the Debian Maintenance User
46 |
47 | create_DMU()
48 | {
49 | cat > /etc/mysql/debian.cnf << H2
50 | [client]
51 | host = localhost
52 | user = debian-sys-maint
53 | password = 03P8rdlknkXr1upf_H2
54 | socket = /var/run/mysqld/mysqld.sock
55 | [mysql_upgrade]
56 | host = localhost
57 | user = debian-sys-maint
58 | password = 03P8rdlknkXr1upf_H2
59 | socket = /var/run/mysqld/mysqld.sock
60 | basedir = /usr
61 | H2
62 | mysql -udebian-sys-maint -p03P8rdlknkXr1upf_H2 -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
63 | sleep 3
64 | }
65 |
66 | run()
67 | {
68 | read -p "What node you want install Galera?: " NODE;
69 | case $NODE in
70 | 1)
71 | setup_Ubuntu
72 | configure_Galera $IP1 $NODE
73 | create_DMU
74 | start_node1_Ubuntu
75 | ;;
76 |
77 | 2)
78 | setup_Ubuntu
79 | configure_Galera $IP2 $NODE
80 | create_DMU
81 | start_Ubuntu
82 | ;;
83 |
84 | 3)
85 | setup_Ubuntu
86 | configure_Galera $IP3 $NODE
87 | create_DMU
88 | start_Ubuntu
89 | create_DMU
90 | ;;
91 | *)
92 | echo "Invaild input!"
93 | ;;
94 | esac
95 | }
96 |
97 | main()
98 | {
99 | file="conf.cfg"
100 | if [ -f "$file" ]
101 | then
102 | clear
103 | echo "$file found."
104 | . conf.cfg
105 | echo -e "--------INFO---------
106 | Node1: $IP1
107 | Node2: $IP2
108 | Node3: $IP3
109 | Password: $PASSWORD
110 | ----------------------"
111 | run
112 | else
113 | echo Please fill info in file 'conf.cfg'!
114 | cat > conf.cfg << H2
115 | export PASSWORD=Abcdef@6789
116 | export IP1=1.1.1.1
117 | export IP2=2.2.2.2
118 | export IP3=3.3.3.3
119 | H2
120 | vi conf.cfg
121 | fi
122 |
123 |
124 | }
125 |
126 | main
--------------------------------------------------------------------------------
/drafts/Hadoop-v1.mmap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/Hadoop-v1.mmap
--------------------------------------------------------------------------------
/drafts/NNSv1.mmap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/NNSv1.mmap
--------------------------------------------------------------------------------
/drafts/NNSv2.mmap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/NNSv2.mmap
--------------------------------------------------------------------------------
/drafts/NNSv3.mmap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/NNSv3.mmap
--------------------------------------------------------------------------------
/drafts/README-1.md:
--------------------------------------------------------------------------------
1 | # Galera Cluster với MySQL
2 |
3 | ## Giới thiệu
4 |
5 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng.
6 |
7 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**:
8 |
9 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive.
10 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node
11 |
12 | Trong bài hướng dẫn này, chúng ta sẽ sử dụng mode **Active - Active** với mô hình 3 máy chủ. (Yêu cầu tối thiểu của Galera cluster)
13 |
--------------------------------------------------------------------------------
/drafts/ghichepdb.md:
--------------------------------------------------------------------------------
1 | ## Ghi chép về các kỹ thuật/giải pháp HA cho mysql/mariadb
2 |
3 | ###Mục lục:
4 | [1. Giới thiệu về HA cho DB ](#1)
5 |
6 | [2. Giải pháp hỗ trợ sẵn ](#2)
7 |
8 | - [2.1 Giới thiệu về Replication ](#2.1)
9 |
10 | - [2.2 Các kiểu Replication ](#2.2)
11 |
12 | [2.2.1 Master - Slave ](#2.2.2)
13 |
14 | [2.2.2 Master - Master ](#2.2.2)
15 |
16 | [3. Giải pháp ngoài ](#3)
17 |
18 | - [3.1 Galera](#3.1)
19 | - [3.2 DRBD ](#3.2)
20 |
21 | [4. Kết luận ](#4)
22 |
23 |
24 | ### 1. Giới thiệu
25 |
26 | Ngày nay, công nghệ thông tin đã ăn sâu vào nhiều lĩnh vực trong đời sống phục vụ cho sản xuất, giải trí và đặc biệt nhu cầu thông tin. Các hệ thống này luôn được đầu tư với quy mô càng ngày càng mở rộng, là hướng phát triển trọng tâm của doanh nghiệp cung cấp nội dung. Để đảm bảo các dịch vụ chạy thông suốt, phục vụ tối đa đến nhu cầu của người sử dụng và nâng cao tính bảo mật, an toàn dữ liệu; giải pháp High Availability được nghiên cứu và phát triển bởi nhiều hãng công nghệ lớn. Với Database, tính an toàn và khả dụng được đặt lên hàng đầu. Vì vậy, ở bài viết này, chúng tôi xin phép điểm qua một vài Giải pháp HA cho hệ cơ sở dữ liệu sử dụng MySQL hoặc MariaDB đang được cộng đồng tin dùng.
27 |
28 |
29 | ### 2. Giải pháp hỗ trợ sẵn (Thuần túy không sử dụng sản phẩm của bên thứ 3)
30 |
31 |
32 | #### 2.1 Giới thiệu về Replication
33 |
34 | **Replication** là tính năng cho phép dữ liệu của (các) máy chủ Master được sao chép/nhân bản trên một hoặc nhiều máy chủ khác (Slave). Mục đích của việc này là để sao lưu dữ liệu ra các máy chủ khác đề phòng máy chủ chính gặp sự cố.
35 |
36 | **Có thể sao chép/nhân bản được những gì?**
37 |
38 | Tùy vào mục đích sử dụng, tính năng này cho phép chúng ta sao chép/nhân bản từ Tất cả các DB trên Master, một hoặc nhiều DB, cho đến các bảng trong mỗi DB sang Slave một cách tự động.
39 |
40 | **Cơ chế hoạt động**
41 |
42 | Máy chủ Master sẽ gửi các binary-log đến máy chủ Slave. Máy chủ Slave sẽ đọc các binary-log từ Mster để yêu cầu truy cập dữ liệu vào quá trình replication. Một relay-log được tạo ra trên slave, nó sử dụng định dạng giống với binary-log. Các relay-log sẽ được sử dụng để replication và được xóa bỏ khi hoàn tất quá trình replication.
43 |
44 | Các master và slave không nhất thiết phải luôn kết nối với nhau. Nó có thể được đưa về trạng thái offline và khi được kết nối lại, quá trình replication sẽ được tiếp tục ở thời điểm nó offline.
45 |
46 | **Binary-log là gì?**
47 |
48 | Binary-log chứa những bản ghi ghi lại những thay đổi của các database. Nó chứa dữ liệu và cấu trúc của DB (có bao nhiêu bảng, bảng có bao nhiêu trường,...), các câu lệnh được thực hiện trong bao lâu,... Nó bao gồm các file nhị phân và các index.
49 |
50 | Binary-log được lưu trữ ở dạng nhị phân không phải là dạng văn bản plain-text.
51 |
52 |
53 | #### 2.2 Các kiểu Replication
54 |
55 |
56 | ##### 2.2.1 Master - Slave
57 | **Master - Slave**: là một kiểu trong giải pháp HA cho DB, mục đích để đồng bộ dữ liệu của DB chính (Master) sang một máy chủ DB khác gọi là Slave một cách tự động.
58 |
59 |
60 |
61 | ###### 2.2.2 Master - Master
62 |
63 | **Master - Master**: Khi cấu hình kiểu này, 2 DB sẽ tự động đồng bộ dữ liệu cho nhau.
64 |
65 |
66 |
67 |
68 | #### 3 Giải pháp ngoài
69 |
70 |
71 | ##### 3.1 Galera
72 |
73 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng.
74 |
75 |
76 |
77 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**:
78 |
79 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive.
80 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node
81 |
82 |
83 | ##### 3.2 DRBD (Distributed Replicated Block Device)
84 |
85 |
86 | Nguồn: https://mariadb.com/kb/en/mariadb/replication-overview/
87 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/drafts/setup-centos-full.bash:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | setup_Centos()
4 | {
5 | yum -y install centos-release-scl-rh centos-release-scl
6 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo
7 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
8 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server
9 | scl enable rh-mariadb101 bash
10 | cat > /etc/profile.d/rh-mariadb101.sh << H2
11 | #!/bin/bash
12 |
13 | source /opt/rh/rh-mariadb101/enable
14 | export X_SCLS="`scl enable rh-mariadb101 'echo $X_SCLS'`"
15 | H2
16 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server-galera
17 | # firewall-cmd --add-service=mysql --permanent
18 | # firewall-cmd --add-port={3306/tcp,4567/tcp,4568/tcp,4444/tcp} --permanent
19 | # firewall-cmd --reload
20 | systemctl restart rh-mariadb101-mariadb
21 | systemctl enable rh-mariadb101-mariadb
22 | mysql -uroot -p -e "UPDATE mysql.user SET Password=PASSWORD('$PASSWORD') WHERE User='root';
23 | DELETE FROM mysql.user WHERE User='';
24 | DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
25 | DROP DATABASE IF EXISTS test;
26 | DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
27 | FLUSH PRIVILEGES;"
28 | systemctl restart rh-mariadb101-mariadb
29 | mysql -uroot -p$PASSWORD -e "show databases;"
30 | }
31 |
32 | configure_n1_centos()
33 | {
34 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org
35 | cat > /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf << H2
36 | [galera]
37 | # Mandatory settings
38 | wsrep_on=ON
39 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so
40 | wsrep_cluster_address=gcomm://
41 |
42 | binlog_format=row
43 | default_storage_engine=InnoDB
44 | innodb_autoinc_lock_mode=2
45 | bind-address=0.0.0.0
46 |
47 | wsrep_cluster_name="MariaDB_Cluster"
48 | wsrep_node_address="$1"
49 | wsrep_sst_method=rsync
50 | H2
51 | /opt/rh/rh-mariadb101/root/usr/bin/galera_new_cluster
52 | }
53 |
54 | configure_centos(){
55 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org
56 | cat > /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf << H2
57 | [galera]
58 | # Mandatory settings
59 | wsrep_on=ON
60 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so
61 | wsrep_cluster_address="gcomm://$IP1,$IP2,$IP3"
62 |
63 | binlog_format=row
64 | default_storage_engine=InnoDB
65 | innodb_autoinc_lock_mode=2
66 | bind-address=0.0.0.0
67 |
68 | wsrep_cluster_name="MariaDB_Cluster"
69 | wsrep_node_address="$1"
70 | wsrep_sst_method=rsync
71 | H2
72 | systemctl restart rh-mariadb101-mariadb
73 | }
74 |
75 | run()
76 | {
77 | for x in $IP1 $IP2 $IP3
78 | do
79 | tmp=$(ip a | grep -w "$x")
80 | if [ -n "$tmp" ]
81 | then
82 | IP=$x
83 | fi
84 | done
85 | list=`cat conf.cfg`
86 | for i in $list
87 | do
88 | y=`echo $i | grep -w "$IP"`
89 | if [ -n "$y" ]
90 | then
91 | NODE=`echo $y | awk -F = '{print $1}' | awk -F P {'print $2'}`
92 | fi
93 | done
94 | if [ -n "$NODE" ] && [ -n "$IP" ]
95 | then
96 | echo "NODE $NODE has IP address: $IP"
97 |
98 | case $NODE in
99 | 1)
100 | setup_Centos
101 | configure_n1_centos $IP
102 | ;;
103 |
104 | *)
105 | setup_Centos
106 | configure_centos $IP
107 | ;;
108 | esac
109 | else
110 | echo "Invaild node!"
111 | fi
112 | }
113 |
114 | main()
115 | {
116 | file="conf.cfg"
117 | if [ -f "$file" ]
118 | then
119 | clear
120 | echo "$file found."
121 | . conf.cfg
122 | echo -e "--------INFO---------
123 | Node1: $IP1
124 | Node2: $IP2
125 | Node3: $IP3
126 | Password: $PASSWORD
127 | ----------------------"
128 | run
129 | else
130 | echo Please fill info in file 'conf.cfg'!
131 | read -p "Enter IP Node 1: " IP1
132 | read -p "Enter IP Node 2: " IP2
133 | read -p "Enter IP Node 3: " IP3
134 | read -p -s "Enter password for MySQL's root: " pass1
135 | while true
136 | do
137 | read -p -s $'\Re-Enter password for MySQL\'s root: ' pass2
138 | if [ "$pass1" = "$pass2" ]
139 | then
140 | break
141 | else
142 | echo "Not match!"
143 | fi
144 | done
145 |
146 | cat > conf.cfg << H2
147 | export PASSWORD=$pass2
148 | export IP1=$IP1
149 | export IP2=$IP2
150 | export IP3=$IP3
151 | H2
152 | fi
153 |
154 | }
155 |
156 | main
--------------------------------------------------------------------------------