Введение
В этой статье мы рассмотрим, как развернуть масштабируемый кластер SQL в Kubernetes. Прежде чем мы начнем, важно понять, что такое Kubernetes и некоторые детали, связанные с ним. Если вы не знаете основ, я предлагаю взглянуть на эту ссылку, чтобы начать.
Чтобы развернуть масштабируемую структуру MySQL, мы можем разбить ее на 3 части:
Создание кластера Kubernetes в DigitalOcean
Настройка оператора MySQL и базы данных
Тестирование возможностей кластера и эксперименты
Создание кластера Kubernetes в DigitalOcean
В панели управления DigitalOcean создайте новый кластер Kubernetes.
Я выбрал регион своего центра обработки данных как Бангалор (BLR1), но вы можете выбрать любой.
Я больше ничего не менял при создании кластера, кроме имени, которое я установил на sql-k8s-cluster
.
После этого нажмите «Создать», и все готово!
Настройка кластера занимает 5 минут, в это время вы можете загрузить файл конфигурации для кластера и добавить его в каталог, в котором вы работаете. Мой файл конфигурации назывался sql-k8s-cluster-kubeconfig.yaml
. После запуска кластера мы запускаем следующую команду.
cd ~/.kube && kubectl --kubeconfig="sql-k8s-cluster-kubeconfig.yaml" get nodes
Это показывает узлы, а также их детали. Вывод выглядит примерно так.
Следующим шагом является настройка оператора MySQL и нашей базы данных.
Настройка оператора MySQL и базы данных
Чтобы понять, что такое оператор MySQL, нам нужно понять, что такое оператор в Kubernetes. Оператор упаковывает, развертывает и управляет приложением Kubernetes.
Оператор MySQL
Оператор MySQL управляет настройками кластера MySQL InnoDB в кластере Kubernetes. Оператор управляет полным жизненным циклом, включая настройку и обслуживание приложения, автоматизируя обновления и резервное копирование.
Примечание. Оператор MySQL для Kubernetes в настоящее время находится в состоянии предварительного просмотра. НЕ ИСПОЛЬЗОВАТЬ В ПРОИЗВОДСТВЕ — оператор MySQL на GitHub.
Что такое ИнноДБ?
Справочное руководство MySQL говорит:
InnoDB — это механизм хранения общего назначения, который сочетает в себе высокую надежность и высокую производительность. В MySQL 5.6 InnoDB является механизмом хранения MySQL по умолчанию.
По сути, это программный компонент MySQL, который обрабатывает операции SQL, такие как создание, чтение, обновление и удаление таблиц.
Сначала мы устанавливаем оператор MySQL отсюда и выполняем следующую команду. Чтобы это работало, убедитесь, что установлен Helm (менеджер пакетов, работающий поверх K8s).
helm install mysql-operator helm/mysql-operator --namespace mysql-operator --create-namespace --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
Вывод должен быть примерно таким.
Пространства имен
В Kubernetes пространства имен позволяют изолировать ресурсы в пределах одного кластера. Имена ресурсов должны быть уникальными внутри пространства имен, но не между пространствами имен.
Затем мы создаем пространство имен с именем sql-cluster
, выполнив следующую команду.
kubectl create namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
Чтобы создать кластер MySQL InnoDB с использованием kubectl
, нам нужно создать секрет, содержащий учетные данные. Выполните следующую команду в своем терминале и установите пароль по вашему выбору.
kubectl create secret generic mypwds \ --from-literal=rootUser=root \ --from-literal=rootHost=% \ --from-literal=rootPassword="your secret password, REPLACE ME"
Следующим шагом будет запись конфигурации нашего кластера. Мы создаем файл с именем config.yaml
и вводим следующие данные.
apiVersion: mysql.oracle.com/v2alpha1 kind: InnoDBCluster metadata: name: sql-cluster namespace: sql-cluster spec: secretName: mypwds instances: 3 router: instances: 1
После сохранения файла выполните следующую команду, чтобы применить настройки к нашему кластеру MySQL.
kubectl apply -f config.yaml --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
Чтобы просмотреть состояние нашего кластера и увидеть, как запускаются модули, мы выполняем следующую команду и наблюдаем магию. Это занимает около 5 минут, так что берите кофе! ☕️
kubectl get innodbcluster --watch --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
Чтобы получить сведения о службе и посмотреть, на каком порту доступен наш кластер MySQL, выполните следующие команды.
kubectl get service sql-cluster --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml kubectl describe service sql-cluster --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
Чтобы получить доступ к кластеру MySQL, мы перенаправляем его на порт и обращаемся к нему через командную строку. Мы также можем использовать клиенты MySQL, такие как DataGrip или PHPMyAdmin. Выполняем следующую команду и замечаем, что кластер доступен через порт 6446.
kubectl port-forward service/sql-cluster mysql --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
Теперь мы можем получить доступ к нашему кластеру, который находится на порту 6446, выполнив приведенную ниже команду. Нам будет предложено ввести пароль, который мы установили ранее.
mysql -h127.0.0.1 -P6446 -uroot -p
Сделав это, мы успешно создали наш кластер MySQL с помощью оператора MySQL. Теперь мы рассмотрим добавление данных и тестирование возможностей нашего кластера Kubernetes.
Тестирование возможностей кластера и эксперименты
Чтобы увидеть, насколько устойчив и масштабируем наш кластер, нам нужны некоторые данные.
Мы создаем таблицу с именем students
, в которой хранятся id
, name
и department
учащегося.
CREATE TABLE students (id INT(3) PRIMARY KEY, name VARCHAR(20) NOT NULL, dept VARCHAR(5) NOT NULL); INSERT INTO user (1, "Anjaneya", "CSE"); SELECT * FROM students;
При выполнении получаем следующее.
Теперь, когда у нас есть некоторые данные в нашей базе данных, давайте посмотрим, как работает наш кластер, когда мы удаляем модуль, в котором хранятся наши данные.
Устойчивость
Сначала нам нужно определить модуль, в котором хранится приведенная выше таблица. Мы идентифицируем его, определяя, какая переменная в MySQL имеет имя переменной, установленное как hostname
.
SHOW VARIABLES WHERE Variable_name = 'hostname';
Я получил ответ sql-cluster-3
, но это зависит от каждого пользователя. Не волнуйтесь, если вы получите какое-то другое имя.
Теперь мы удаляем этот модуль, выполнив следующую команду (в другом окне терминала).
kubectl delete -n sql-cluster pod sql-cluster-3
В нашем предыдущем окне терминала мы можем наблюдать за изменениями в реальном времени.
Мы видим, как сервер MySQL теряет соединение, определяет, что соединение потеряно, а затем повторно подключается к другому экземпляру и показывает нам наши данные, как будто ничего не произошло.
Масштабируемость
Чтобы определить, является ли наш кластер масштабируемым, нам нужно изменить файл конфигурации (config.yaml
).
Давайте изменим количество экземпляров с 3 на 4.
apiVersion: mysql.oracle.com/v2alpha1 kind: InnoDBCluster metadata: name: sql-cluster namespace: sql-cluster spec: secretName: mypwds instances: 4 router: instances: 1
Теперь давайте посмотрим, как наш кластер kubernetes запускает новые экземпляры. Он понимает, что фактическое состояние отличается от желаемого состояния, и немедленно начинает работать над достижением желаемого состояния.
Не забудьте применить изменения перед просмотром!
kubectl apply -f config.yaml --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml kubectl get innodbcluster --watch --namespace sql-cluster kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
При этом мы успешно развернули наш кластер MySQL и убедились, что он отказоустойчив и масштабируем!
config.yaml
, который использовался в проекте, можно найти в репозитории GitHub.