Guest User

Untitled

a guest
May 25th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.66 KB | None | 0 0
  1. #!/bin/bash -x
  2.  
  3. # clear out the old stuff
  4. docker rm -f master
  5. docker rm -f slave
  6.  
  7. cat > my.cnf <<CONFIG
  8. [client]
  9. user=root
  10. password=root
  11. CONFIG
  12.  
  13. cat > master.cnf <<MASTER
  14. [mysqld]
  15. server-id = 1
  16. log-bin = /var/log/mysql/mysql-bin.log
  17. binlog-format = STATEMENT
  18. general-log = on
  19. general_log_file = query.log
  20. performance-schema-instrument = 'wait/lock/metadata/sql/mdl=ON'
  21. MASTER
  22.  
  23. cat > slave.cnf <<SLAVE
  24. [mysqld]
  25. server-id = 2
  26. log-bin = /var/log/mysql/mysql-bin.log
  27. relay-log = /var/log/mysql/mysql-relay-bin.log
  28. binlog-format = STATEMENT
  29. general-log = on
  30. general_log_file = query.log
  31. performance-schema-instrument = 'wait/lock/metadata/sql/mdl=ON'
  32. SLAVE
  33.  
  34. # create two mysqls in docker, let the second one be the slave of the first one
  35. cat <<DOCKER-COMPOSE |
  36. version: '3.2'
  37. services:
  38. master:
  39. container_name: master
  40. image: mysql:5.7.22
  41. environment:
  42. - MYSQL_ROOT_PASSWORD=root
  43. volumes:
  44. - "./master.cnf:/etc/mysql/conf.d/master.cnf"
  45. - "./my.cnf:/my.cnf"
  46. slave:
  47. container_name: slave
  48. image: mysql:5.7.22
  49. environment:
  50. - MYSQL_ROOT_PASSWORD=root
  51. volumes:
  52. - "./slave.cnf:/etc/mysql/conf.d/slave.cnf"
  53. - "./my.cnf:/my.cnf"
  54.  
  55. DOCKER-COMPOSE
  56. /usr/local/bin/docker-compose -f - up -d
  57.  
  58. # wait for both instances to run (look for "ready for connections" on stderr)
  59. docker logs -f master 2>&1 | grep -q 'mysqld: ready for connections'
  60. docker logs -f slave 2>&1 | grep -q 'mysqld: ready for connections'
  61.  
  62. # configure and start the slave
  63. until docker exec slave mysql --defaults-file=/my.cnf -e "change master to MASTER_HOST='master', MASTER_USER='root', MASTER_PASSWORD='root';"
  64. do echo "waiting for slave to be ready"; sleep 1; done
  65.  
  66. sleep 1
  67.  
  68. docker exec slave mysql --defaults-file=/my.cnf -e "start slave;"
  69.  
  70. # create a table to test on
  71. docker exec master mysql --defaults-file=/my.cnf -e "create database slask;"
  72. docker exec master mysql --defaults-file=/my.cnf -e "create table slask.insert_error (id int, name varchar(255), primary key (id));"
  73.  
  74. # make the MASTER pre-test state, 3 rows => 2 gaps
  75. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (1, 'dude');"
  76. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (2, 'dude');"
  77. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (3, 'dude');"
  78. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (4, 'dude');"
  79. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (5, 'dude');"
  80. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (6, 'dude');"
  81. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (7, 'dude');"
  82. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (8, 'dude');"
  83. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (9, 'dude');"
  84. docker exec master mysql --defaults-file=/my.cnf -e "insert into slask.insert_error values (10, 'dude');"
  85.  
  86. # make the SLAVE pre-test state, create a gap
  87. until docker exec slave mysql --defaults-file=/my.cnf -e "delete from slask.insert_error where id = 7;"
  88. do echo "waiting for table to appear on slave"; sleep 1; done
  89.  
  90. # do two parallell XA transactions that insert into the two gaps (that's only one gap on the slave)
  91. docker exec master mysql --defaults-file=/my.cnf -e "XA START 'one'; insert ignore into slask.insert_error values (7, 'dude'); XA END 'one'; XA PREPARE 'one';"
  92. docker exec master mysql --defaults-file=/my.cnf -e "XA START 'two'; insert ignore into slask.insert_error values (7, 'dude'); XA END 'two'; XA PREPARE 'two';"
  93.  
  94. # select the same row on the slave, make sure it runs in the background
  95. docker exec slave mysql --defaults-file=/my.cnf -e "select count(*) from slask.insert_error where id = 7 for update" &
  96. SLAVE_PID=$!
  97.  
  98. # commit them in order
  99. docker exec master mysql --defaults-file=my.cnf -e "XA COMMIT 'one';"
  100. docker exec master mysql --defaults-file=my.cnf -e "XA COMMIT 'two';"
  101.  
  102. sleep 1
  103.  
  104. # watch it blow up!
  105. echo "slave not catching up"
  106. docker exec slave mysql --defaults-file=/my.cnf -e'show slave status\G' | grep Master_Log_Pos
  107.  
  108. echo "two processes, slave sql thread and select on slave"
  109. docker exec -it slave mysql --defaults-file=/my.cnf -e'show processlist'
  110.  
  111. echo "kill the slave select"
  112. kill $SLAVE_PID
Add Comment
Please, Sign In to add comment