предисловие
В первых нескольких статьях в качестве темы в течение некоторого времени использовалась весна. Тема высокого параллелизма и распределения также очень сильна и может сказать о многом. Я также снова открыл дыру, а затем разделил P, чтобы продолжить медленно. Как и большинство людей, я учусь, а не проповедник. Я больше склоняюсь к своему собственному резюме, чем к авторитету. Мое первоначальное намерение сделать резюме и попытаться сделать его как можно более простым. Лучше всего добавить поощрение, и я также надеюсь, что все могут добиться прогресса вместе.
Система распределенной разработки с высокой степенью параллелизма уже очень велика.Из использования отечественных интернет-компаний можно обнаружить, что RPC, Dubbo и ZK являются самыми базовыми требованиями к навыкам. Насчет Zookeeper, у вас остались впечатления от реестра Dubbo? И как это работает? Как насчет классических сценариев приложений? По первым трем вопросам, если у вас нет собственных идей или вы не понимаете их, когда отвечаете на них, то я думаю, что могу помочь вам начать работу и углубить свои знания, чтобы вы могли лучше ответить на собеседовании.
Нечего сказать, давайте к делу
1. Проблемы в параллельных средах
Вспоминая, когда мы учились многопоточности, было очень интересно иметь картинку в интернете
По сути, мы заменили потоки процессами, что эквивалентно запуску программы на каждом сервисе, одно и то же приложение работает на нескольких кластерах серверов, чтобы решить ситуацию, когда один сервис не может справиться с высоким параллелизмом. И пытаясь справиться с этими ситуациями, у нас возникает много проблем, подобных этой.
Например, у нас сейчас кластер из 3-х серверов, Как обеспечить согласованность информации о конфигурации, используемой всеми машинами?
Одна машина умирает, как другие машины чувствуют изменения и берут верх?
Внезапное увеличение числа пользователей требует добавления машин, чтобы снизить нагрузку Как завершить добавление машин без перезапуска кластера?
Как в распределенной системе эффективно координировать несколько служб для записи в один и тот же сетевой файл (сеть не мгновенная, ненадежная и есть задержка)?
На данный момент нам нужен инструмент, похожий на механизм координации потоков, который позволяет процессам взаимодействовать.
2. Введение в Zookeeper
① Происхождение названия Zookeeper.
Многие проекты с открытым исходным кодом на apache используют изображения животных в качестве значков, например, кот — это кошка, улей — это оса и т. д. Работа смотрителя зоопарка — координировать действия этих животных.
② Введение в Zookeeper
Zookeeper — это высокопроизводительный сервис координации распределенных приложений, особенностью которого является то, что данные хранятся в памяти, а персистентность реализована в логах. Его память похожа на древовидную структуру с высокой пропускной способностью и низкой задержкой, что может помочь нам реализовать распределенный унифицированный центр конфигурации, регистрацию служб, распределенные блокировки и т. д. Серверы, составляющие службу ZooKeeper, должны знать друг о друге. Они поддерживают образ состояния в памяти, а также журналы транзакций и моментальные снимки в постоянном хранилище. Служба ZooKeeper доступна до тех пор, пока доступно большинство серверов. Клиенты подключаются к одному серверу ZooKeeper. Клиент поддерживает TCP-соединение, по которому он отправляет запросы, получает ответы, получает события мониторинга и отправляет тики. Если TCP-соединение с сервером прервано, клиент подключится к другому серверу.
③ Установка Zookeeper (под Linux)
1.JDK版本需要在1.6以上
2.下载: https://archive.apache.org/dist/zookeeper/zookeeper-3.5.2/zookeeper-3.5.2.tar.gz
3.解压后的conf目录,增加配置文件zoo.cfg
4.启动服务端 bin/zkServer.sh start
5.测试,客户端连接: bin/zkCli.sh -server 127.0.0.1:2181
zoo.cfg的关键配置有3个:
tickTime=2000:一次心跳的基本时间,
dataDir:数据与日志的存放处
clientPort:端口号
④ Возможности Zookeeper
1. Простая структура данных
Подобно древовидной структуре файловой системы Unix, каждый каталог становится узлом Znode, но он отличается от файловой системы.. Его можно рассматривать как папку или файл для хранения данных, но обычно мы все же должны называть его узлом. узел Назовите папку так дешево.
Следует отметить, что имена подузлов в одном узле не могут быть одинаковыми, а именование стандартизировано.Его путь не имеет понятия относительного пути, это абсолютный путь.Любое начало начинается с «/», и наконец, размер хранимых данных ограничен
2. Особенности модели данных
Иерархическое пространство имен: как упоминалось выше, файловая система, похожая на Unix, с «/» в качестве корня, узлы могут содержать связанные данные и дочерние узлы, абсолютные пути Znode: Имя уникально, именование стандартизировано, и существует 4 типа: постоянный, последовательный, временный, временный порядок, а данные узла будут упомянуты позже.
3. Соглашения об именах
Имена узлов могут использовать любые символы Юникода, за исключением следующих ограничений:
1. null字符(\u0000)不能作为路径名的一部分;
2. 以下字符不能使用,因为它们不能很好地显示,或者以令人困惑的方式呈现:\u0001 - \u0019和\u007F - \u009F。
3. 不允许使用以下字符:\ud800 - uf8fff, \uFFF0 - uFFFF。
4. “.”字符可以用作另一个名称的一部分,但是“.”和“..”不能单独用于指示路径上的节点,因为ZooKeeper不使用相对路径。
下列内容无效:“/a/b/. / c”或“c / a / b / . . /”。
5. “zookeeper”是保留节点名。
4. Некоторые команды
Поскольку мой компьютер является оконной системой, я нашел оконную версию zookeeper, чтобы продемонстрировать
Давайте сначала кратко объясним содержимое каждого каталога.
bin ---> 包括了linux和window的运行程序的运行目录
conf ---> zookeeper的配置zoo.cfg
contrib ---> 其他一些组件和发行版本
dist-maven ---> maven发布下的一些jar包
docs ---> 文档
lib ---> 库
recipe ---> 一些应用实例
src ---> zookeeper的源码,因为zookeeper是java写出来的
Запустите zkServer.cmd в каталоге bin, а затем запустите zkClient.cmd.Когда я вообще не знаю, как учиться, обычно я могу получить помощь, набрав команды help, -help, -h, как показано ниже, я просто ввел команда -help на клиенте
Поскольку команды относительно просты, я не буду их демонстрировать, единственное, на что следует обратить внимание, это обратить внимание на путь "/", например, ls/ - это корневая директория, create /zk 123 и условия поддержки каждой команды, такой как создание, должно быть Предоставление родительского узла, когда удаляемый узел удаляется, вторичный узел не может иметь дочерних узлов и т. д.
5. Важные особенности Zookeeper --- Порядок
Предоставляет несколько способов отслеживания времени. ZooKeeper помечает каждое обновление номером, который отражает порядок всех транзакций ZooKeeper. Строгий порядок означает, что сложные примитивы синхронизации могут быть реализованы на клиенте Объясните настройку тиков в czxid, version, zoo.cfg
- Zxid: каждый запрос на запись в Zookeeper соответствует уникальному идентификатору транзакции, называемому Zxid, который является глобальным и упорядоченным.Если Zxid1 меньше Zxid2, то Zxid1 должен произойти до Zxid2.
- номера версий: номера версий, запросы на запись к узлу увеличат три номера версии узла (по сути, процедура похожа на оптимистическую блокировку), dataVersion (количество изменений в данных znode), cversion (количество изменений в дочерние узлы znode) , aclVersion (количество изменений в ACL znode
- тики: при использовании многосерверного Zookeeper сервер использует «тик» для определения времени таких событий, как загрузка состояния, время ожидания сеанса и т. д. Это отображается косвенно через минимальное время ожидания сеанса (по умолчанию время тика x2), если клиентские запросы превышают это время, клиент больше не может подключиться к серверу
- в режиме реального времени: Zookeeper не использует режим реального времени.
Вы можете использовать stat path или ls2 для просмотра этой информации.
cZxid:创建该节点的zxid
ctime:该节点的创建时间
mZxid:该节点的最后修改zxid
mtime:该节点的最后修改时间
pZxid:该节点的最后子节点修改zxid
cversion:该节点的子节点变更次数
dataVersion:该节点数据被修改的次数
aclVersion:该节点的ACL变更次数
aphemeraOwner:临时节点所有者会话id,非临时的为0
dataLength:该节点数据长度
numChildren:子节点数
Эти данные говорят нам со стороны, что смотритель зоопарка является координатором.
6. Вторая особенность zookeeper --- воспроизводимость
Данные можно копировать и создавать резервные копии. Zookeeper может быстро построить кластер, он поставляется с такими инструментами и механизмами, нам нужно только установить некоторые конфигурации, чтобы обеспечить надежные сервисы и не стать единой точкой отказа.
7. Третья функция zookeeper --- быстрая
Некоторые функции zookeeper можно применять к большим распределенным системам.
3. Теория зоозащитника
① сеансовый механизм зоопарка
Сеанс сеанса
1.一个客户端连接一个会话,由zookeeper分配唯一会话id
2.客户端以特定的时间间隔发送心跳以保持会话有效,
3.超过会话超时时间未收到客户端的心跳,则判断客户端无效(默认2倍tickTime)
4.会话中额请求是FIFO(先进先出原则)的顺序执行
② Состав данных znode
节点数据:存储的基本信息(状态,配置,位置等)
节点元数据:stat命令下的一些数据
数据大小:限制1M
③ Тип узла znode
1.持久节点:直接通过create path value所创建
2.临时节点:create -e path value
3.顺序节点:create -s path value
注意
1.session会话失效时,临时节点就会被删除
2.顺序节点的创建,后为10位十进制序号,每个父节点拥有一个计数器,这个计数器也是有限制的,到2147483647之后将溢出
3.顺序节点在会话结束仍然存在
④ Механизм мониторинга часов
Клиент может настроить наблюдение за znodes для отслеживания изменений znodes, включая добавления, удаления и изменения, которые можно просмотреть через stat path, ls2 path get path
Существует 4 условия для запуска события просмотра, создания, удаления, изменения, дочернего элемента (события дочернего узла).
Важные особенности часов
1.仅一次性:watch触发后会立即删除,要持续监听变化的话就要持续提供设置watch,这也是watch的注意事项
2.有序性:客户端先得到watch通知才可查看变化结果
Примечания к часам
1.刚刚提及到的它的仅一次性
2.获取事件和发送watch,获取watch,这些请求有可能存在延时,所以不能绝对可靠得到每个节点发生的每个更改
3.一个watch对象只会被通知一次,如果一个watch同时注册了多个接口(exists,getData),如果此时删除节点,虽然这个事件对exists和getData都有效,但是watch只会被调用一次
Блокирующий механизм пробуждения потока — клиент может пассивно принимать уведомления о состоянии других клиентских процессов.
⑤ Особенности зоопарка
1.顺序一致性(Sequential Consistency),保证客户端操作是按顺序生效的;
2.原子性(Atomicity),更新成功或失败。没有部分结果。
3.单个系统映像,无论连接到哪个服务器,客户端都将看到相同的内容
4.可靠性,数据的变更不会丢失,除非被客户端覆盖修改。
5.及时性,保证系统的客户端当时读取到的数据是最新的。
finally
Благодаря приведенному выше описанию у нас должно быть предварительное представление о zookeeper, а затем мы поговорим о распределенных блокировках, кластерах и некоторых сценариях приложений.
Далее: Высокий параллелизм с нуля (2) --- Zookeeper реализует распределенные блокировки