Mã nguồn mở Việt Nam

Trình duyệt

Trình duyệt bạn đang sử dụng
 

Hệ điều hành

Hệ điều hành bạn đang sử dụng
 

Trực tuyến

Hiện có 14 khách Trực tuyến

Trang chủ Database Cấu hình replicate database MySQL Master-to-master.
Cấu hình replicate database MySQL Master-to-master. Email
Viết bởi canh_nguyen   
altCó nhiều kiểu cấu hình replicate, tùy từng trường hợp cụ thể mà sử dụng theo cách nào cho phù hợp.
Ở đây trường hợp của tôi, bài tóan đặt ra như sau :
Code+database website được đặt trên 2 server (1 trong nước, 1 nước ngoài ). Yêu cầu 2 database này phải được đồng bộ thường xuyên với nhau.
Lí do tôi chọn cách cấu hình master to master là bởi thế, với cấu hình này thì 1 server vừa là master vừa là slave, tức nó vừa lắng nghe vừa ra hiệu cho server còn lại nếu có sự thay đổi dữ liệu trong database.

Cả 2 server sử dụng hệ điều hành CentOs, database MySQL version 5.x
Server 1 có IP dạng : 192.168.1.10
Server 2 có IP dạng : 192.168.1.11

Đăng nhập vào chế độ dòng lệnh của MySQL:
$ mysql -u root -p

Thực thi câu lệnh tương tự cho cả 2 server :
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY '%slave_password%';
FLUSH PRIVILEGES;
quit;
Trong đó replication là user,slave_password là mật khẩu của user replication.
Edit file my.cnf của server 1 :
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
max_connections = 400
key_buffer = 16M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
table_cache = 1024
thread_cache_size = 286
interactive_timeout = 25
wait_timeout = 1000
connect_timeout = 60
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 16M
query_cache_type = 1
tmp_table_size = 16M
skip-innodb

log-bin=mysql-bin
binlog-do-db=replicate_test
binlog-ignore-db=mysql
binlog-ignore-db=test

server-id=1

master-host = 192.168.2.11
master-user = replication
master-password = 111111
master-port = 3306

auto_increment_increment= 2
auto_increment_offset   = 2

slave-net-timeout = 30
master-connect-retry = 30

[mysql.server]
user=mysql
basedir=/var/lib	 

[mysqld_safe]
relay-log = relay-bin
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_allowed_packet = 16M

[myisamchk]
keybuffer = 32M
sort_buffer = 32M
read_buffer = 16M
write_buffer = 16M

Edit file my.cnf của server 2 :
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
max_connections = 400
key_buffer = 16M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
table_cache = 1024
thread_cache_size = 286
interactive_timeout = 25
wait_timeout = 1000
connect_timeout = 60
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 16M
query_cache_type = 1
tmp_table_size = 16M
skip-innodb

log-bin=mysql-bin
binlog-do-db=replicate_test
binlog-ignore-db=mysql
binlog-ignore-db=test

server-id=2

master-host = 192.168.2.10
master-user = replication
master-password = 111111
master-port = 3306

auto_increment_increment= 2
auto_increment_offset   = 2

slave-net-timeout = 30
master-connect-retry = 30

[mysql.server]
user=mysql
basedir=/var/lib	 

[mysqld_safe]
relay-log = relay-bin
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_allowed_packet = 16M

[myisamchk]
keybuffer = 32M
sort_buffer = 32M
read_buffer = 16M
write_buffer = 16M

Bạn cần để ý các thông số sau ở cả 2 server :

log-bin=mysql-bin
binlog-do-db=replicate_test
binlog-ignore-db=mysql
binlog-ignore-db=test

server-id=2

master-host = 192.168.2.10
master-user = replication
master-password = 111111
master-port = 3306

auto_increment_increment= 2
auto_increment_offset   = 2

Chú thích các thông số :
binlog-do-db=replicate_test : chỉ định các bảng sẽ được thực hiện replicate
binlog-ignore-db=mysql : Chỉ định các bảng sẽ không được thực hiện replicate
server-id : Id chỉ định cho server.
master-host : Địa chỉ ip của host master
master-user,master-password : user và password theo master-host
master-port: cổng truy vấn của database.
auto_increment_offset : cần đặc biệt chú ý thông số này, trường hợp bạn không thiết lập thông số này database có trường autoincrement sẽ tăng theo giá trị +1 cho giá trị tiếp theo khi insert dữ liệu mới.
Để tránh trường hợp 2 database ở 2 server bị trùng giá trị autoincrement tôi đặt giá trị này auto_increment_offset=1 cho server1 và =2 cho server 2 với mục đích giá trị tự động tăng ở server1 là số lẻ , ở server 2 là số chẵn.

Đăng nhập chế độ dòng lệnh MySQL và thực hiện việc gán master cho server2:
stop slave;
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='replication', MASTER_PASSWORD='%slave_password%';
start slave;

Thực hiện câu lệnh tương tự cho server 1 với MASTER_HOST là 192.168.1.11, user và password.

Kiểm tra sự hoạt động của cả 2 server :
SHOW MASTER STATUS;
SHOW SLAVE STATUS\G;
Nếu 2 option Slave_IO_Running and Slave_SQL_Running đều hiển thị Yes thì bạn đã thành công.
Nếu 1 trong 2 chưa thành công bạn cần kiểm tra lại user và password chính xác, hoặc master-port đã được mở hay chưa.

Tham khảo thêm về replicate MySQL : http://dev.mysql.com/doc/refman/5.1/en/replication-howto.html
Các bình luận
Thêm mới Tìm kiếm
Storm  - Làm sao replicate table user   |222.252.36.xxx |2010-04-20 05:51:42
Trường hợp nếu 2 database ở 2 nơi, giả sử có 1 table user, nếu
ở trong nước có 1 user đăng ký với username là A mà ở ngoài
nước cũng có 1 user đăng ký cùng username thì ứng dụng bị xung
đột username.

Vậy có cách giải quyết trường hợp này không?
canhnm  - re: Làm sao replicate table user   |Administrator |2010-04-20 05:59:16
Storm đã viết:
Trường hợp nếu 2 database ở 2 nơi, giả sử có 1 table user,
nếu ở trong nước có 1 user đăng ký với username là A mà
ở ngoài nước cũng có 1 user đăng ký cùng username thì
ứng dụng bị xung đột username.

Vậy có cách giải
quyết trường hợp này không?

Trường hợp của bạn thì việc giải quyết đơn giản dùng
code để check trong database xem username đó đã được
sử dụng hay chưa thôi.
Bạn hiểu đơn giản với cấu
hình master-to-master như bài viết thì khi 1 user đăng kí ở
database trong nước thành công tức dữ liệu được insert
vào bảng user của database trong nước thì lúc này dữ liệu
của user đó cũng sẽ được insert vào bảng user của
database ở nước ngoài
Atuladn   |222.255.122.xxx |2010-08-27 16:46:26
User có thể trùng nhưng ID của mỗi user sẽ không bào giờ trùng
việc reg tên luôn được kiểm tra trước bằng code
nts   |58.187.100.xxx |2010-11-09 06:26:40
bài viết rất chi tiết. Thanks bạn!
tigerwood  - Error   |118.71.18.xxx |2010-11-16 04:48:04
cho mình hỏi sau khi thực hiện các bước đến bước này :
stop
slave;
CHANGE MASTER TO MASTER_HOST=\'192.168.1.10\',
MASTER_USER=\'replication\', MASTER_PASSWORD=\'slavepass\';

start slave;

=>Sau khi start slave; nó báo lỗi sau trên cả 2 con:
ERROR 1200 (HY000): The server is not configured as slave; fix in config file or
with CHANGE MASTER TO

vậy giải quyết sao bạn nhỉ?
tigerwood  - Error   |118.71.18.xxx |2010-11-16 04:48:11
mình đã start slave; trên 2 server được rồi nhưng Slave_IO_Running
=No and Slave_SQL_Running= yes.
Mình đã kiểm tra như bạn nói user và
pass đã đúng nhưng chưa biết kiểm tra master-port mở chưa như
thế nào
canhnm  - re: Error   |Administrator |2010-11-16 05:07:44
tigerwood đã viết:
mình đã start slave; trên 2 server được rồi nhưng
Slave_IO_Running =No and Slave_SQL_Running= yes.
Mình đã kiểm
tra như bạn nói user và pass đã đúng nhưng chưa biết
kiểm tra master-port mở chưa như thế nào

Phần mở port thì bạn phải có quyền vào modem xem đã NAT
port 3306(port mặc định, có thể máy bạn config port
khác) vào máy cài mysql chưa.
Leo  - Multi Master   |123.24.79.xxx |2011-01-20 06:38:28
Cảm ơn bạn. Bài viết rất hữu ích với mình
Cho mình hỏi:
trường hợp có 3 server
server1-server2: master-to-master

server1-server3: master-to-master
Mình phải cấu hình server1 như thế
nào? Thanks.
canhnm   |Administrator |2011-01-20 07:01:56
Bạn tham khảo thử cái này :
http://mysql-mmm.org/mmm2:guide
http://onlamp.com
/pub/a/onlamp/2006/04/20/advanced-mysql-replicatio n.html?page=1
vinh.ho  - multi máter replicate   |123.24.103.xxx |2011-02-17 07:07:08
link die hết rồi bạn ơi,
bạn có thể hướng dẫn cụ thể cho
anh em hiểu luôn ko bạn :D
Viết bình luận
Tên:
Email:
 
Tiêu đề:
UBBCode:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:):grin;)8):p:roll:eek:upset:zzz:sigh:?:cry
:(:x
 
Hãy điền mã chống spam mà bạn thấy trong ảnh.
 
View My Stats supersensitive
supersensitive
supersensitive
supersensitive