Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make mariadb replicas to work with 10.2 to 10.7 #83

Merged
merged 2 commits into from
Aug 29, 2022

Conversation

stronk7
Copy link
Member

@stronk7 stronk7 commented Aug 24, 2022

This must be merged AFTER #82 !!

The code used here is 99% the same than the mysql one. But finally
I've decided to copy it all over own mariadb.d directory.

$ diff -r mysql.d mariadb.d
diff -r mysql.d/master/docker-entrypoint-initdb.d/01_privileges.sql mariadb.d/master/docker-entrypoint-initdb.d/01_privileges.sql
1c1
< CREATE USER 'replication'@'%' IDENTIFIED WITH mysql_native_password BY 'replication';
---
> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication';

The only difference is when creating the replication database user
because the MySQL sentence:

CREATE USER 'replication'@'%' IDENTIFIED WITH mysql_native_password BY 'replication';

Doesn't work with MariaDB. In fact, since MariaDB 10.2 the
mysql_native_password is the default authentication plugin
so it doesn't need to be specified. So this works the same:

CREATE USER 'replication'@'%' IDENTIFIED BY 'replication';

A working alternative is also:

CREATE USER 'replication'@'%' IDENTIFIED WITH mysql_native_password USING PASSWORD('replication');

But I've gone with the simple one because it's future better.

As said, everything else is 100% the same, but better split that making
complicated conditionals to get both working with the same config files.

This fixes moodlehq#80. It has been detected that MySQL main/replica
configurations have stopped working. My personal bet is that
some changes in the MySQL images have leaded to that, or maybe
they were working for MySQL 5.6 and never have worked to 5.7.

NVM, this commit just makes them back to work for both 5.7 and 8.0,
that are the currently "supported" MySQL databases.

Note that, after this PR, we'll be checking the MariaDB main/replica
configurations because they may need similar changes.

Also, while I've tested the solution locally, we are lacking any own
CI for this product, so I've created an issue about that:

moodlehq#81

Finally, here there are the explanations about the changes performed:

1. Moved the bin logs from /var/log/mysql to /var/lib/mysql . Reason
   being that the former directory doesn't exist anymore in MySQL 5.7
   and up (and also, that the binary logs are better with data than
   with logs).
2. Removed the 'multi_admin' user related stuff. Not needed at all.
3. Minor changes to moodle and root GRANT/IDENTIFIED stuff because
   of changes in MySQL 8 (already deprecated in 5.7). Use ALTER USER
   instead.
4. Use IDENTIFIED WITH mysql_native_password (the old password schema),
   because MySQL 8, when using the new hashed schema requires
   communications between the hosts to be encrypted. We don't need that
   extra complexity and while it can be disabled as part of the CHANGE MASTER TO
   command... it cannot be disabled for MySQL 5.7. SO the only option
   working in both versions is the used one (force old passwords schema
   for the replication user).
5. Remove the need of stopping and starting the temp server in the
   replica. All the commands can be executed with the temp server
   running and then the container entrypoint manageing itself will stop
   the temp server and start the final one.
6. Stop needing gosu completely. Now the replica conf files are made
   available via volume mount (like the standalone or main cases).

And that's all. The changes are small and subtle, but each one is
for a good reason, I think.
The code used here is 99% the same than the mysql one. But finally
I've decided to copy it all over own mariadb.d directory.

The only difference is when creating the replication database user
because the MySQL sentence:

CREATE USER 'replication'@'%' IDENTIFIED WITH mysql_native_password BY 'replication';

Doesn't work with MariaDB. In fact, since MariaDB 10.2 the
mysql_native_password is the default authentication plugin
so it doesn't need to be specified. So this works the same:

CREATE USER 'replication'@'%' IDENTIFIED BY 'replication';

A working alternative is also:

CREATE USER 'replication'@'%' IDENTIFIED WITH mysql_native_password USING PASSWORD('replication');

But I've gone with the simple one because it's future better.

As said, everything else is 100% the same, but better split that making
complicated conditionals to get both working with the same config files.
@stronk7
Copy link
Member Author

stronk7 commented Aug 24, 2022

Here there are some runs @ CI (testing branch) using mariadb with read-only replica enabled:

  • MariaDB 10.2 standalone: Build Status
  • MariaDB 10.2 with replica: Build Status
  • MariaDB 10.4 standalone: Build Status
  • MariaDB 10.4 with replica: Build Status
  • MariaDB 10.7 standalone: Build Status
  • MariaDB 10.7 with replica: Build Status

Let's see how they go...

@stronk7 stronk7 merged commit 23d1022 into moodlehq:master Aug 29, 2022
@stronk7 stronk7 deleted the mariadb_replicas_102_104 branch August 29, 2022 14:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant